java获取IP的方法

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

  如果使用了反向代理软件,将http://192.168.1.110:2046/ 的URL反向代理为http://www.xxx.com/ 的URL时,用request.getRemoteAddr()方法获取的IP地址是:127.0.0.1 或 192.168.1.110,而并不是客户端的真实IP。

  经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址。

  Java代码

  public String getIpAddr(HttpServletRequest request) {

  String ip = request.getHeader("x-forwarded-for");

  if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {

  ip = request.getHeader("Proxy-Client-IP");

  }

  if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {

  ip = request.getHeader("WL-Proxy-Client-IP");

  }

  if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {

  ip = request.getRemoteAddr();

  }

  return ip;

  }

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

  答案是取X-Forwarded-For中第一个非unknown的有效IP字符串。如:X-Forwarded-For:192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100,用户真实IP为: 192.168.1.110

阅读更多
个人分类: 菜鸟学java
想对作者说点什么? 我来说一句

java获取IP地址

2010年05月12日 60KB 下载

ASP.NET获取IP方法

2011年04月07日 2KB 下载

java 获取计算机名与IP地址

2010年06月21日 58KB 下载

java 获取网址的IP地址

2010年06月21日 58KB 下载

java获取IP地址

2009年01月20日 61KB 下载

三种方法获取外网(公网)IP

2010年06月17日 10KB 下载

获取客户的ip小例子

2011年08月10日 7KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭