知识大全 Java获取客户端真实IP地址的两种方法

Posted 地址

篇首语:你不勇敢,没人替你坚强。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Java获取客户端真实IP地址的两种方法相关的知识,希望对你有一定的参考价值。

Java获取客户端真实IP地址的两种方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  在JSP里 获取客户端的IP地址的方法是 request getRemoteAddr() 这种方法在大部分情况下都是有效的 但是在通过了Apache Squid等反向代理软件就不能获取到客户端的真实IP地址了

  如果使用了反向代理软件 将 / 的URL反向代理为 / 的URL时 用request getRemoteAddr()方法获取的IP地址是  或  而并不是客户端的真实IP

  经过代理以后 由于在客户端和服务之间增加了中间层 因此服务器无法直接拿到客户端的IP 服务器端应用也无法直接通过转发请求的地址返回给客户端 但是在转发请求的HTTP头信息中 增加了X-FORWARDED-FOR信息 用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址 当我们访问/ 时 其实并不是我们浏览器真正访问到了服务器上的index jsp文件 而是先由代理服务器去访问 代理服务器再将访问到的结果返回给我们的浏览器 因为是代理服务器去访问index jsp的 所以index jsp中通过 request getRemoteAddr()的方法获取的IP实际上是代理服务器的地址 并不是客户端的IP地址

  于是可得出获得客户端真实IP地址的方法一

  public String getRemortIP(HttpServletRequest request)

  if (request getHeader( x forwarded for ) == null)

  return request getRemoteAddr();

  

  return request getHeader( x forwarded for );

  

  可是当我访问/ 时 返回的IP地址始终是unknown 也并不是如上所示的  或  了 而我访问 时 则能返回客户端的真实IP地址 写了个方法去验证 原因出在了Squid上 nf 的配制文件 forwarded_for 项默认是为on 如果 forwarded_for 设成了 off  则 X Forwarded For unknown

  于是可得出获得客户端真实IP地址的方法二

  public String getIpAddr(HttpServletRequest request)

  String ip = request getHeader( x forwarded for );

  if(ip == null || ip length() == || unknown equalsIgnoreCase(ip))

  ip = request getHeader( Proxy Client IP );

  

  if(ip == null || ip length() == || unknown equalsIgnoreCase(ip))

  ip = request getHeader( WL Proxy Client IP );

  

  if(ip == null || ip length() == || unknown equalsIgnoreCase(ip))

  ip = request getRemoteAddr();

  

  return ip;

  

  可是 如果通过了多级反向代理的话 X Forwarded For的值并不止一个 而是一串Ip值 究竟哪个才是真正的用户端的真实IP呢?

  答案是取X Forwarded For中第一个非unknown的有效IP字符串

cha138/Article/program/Java/hx/201311/26104

相关参考