javaweb的request获取真实IP地址

如果我们服务器使用了nginx、squid等反向代理,就不能再用request的获取IP地址方法,因为这时候获取到的代理服务器的地址,是获取不到真实客户端的IP地址。

javaweb的request获取真实IP地址

1、2访问方式是经过代理,3是直接访问服务器。经过代理后,由于在客户端和服务端增加了中间层,所以服务器获取不到真实的IP地址,但是在转发的请求的HTTP头信息,增加了X-FORWARDED-FOR信息,用来跟踪原有的客户端IP地址和原来客户端请求的服务地址。

编写一个工具类来获取到客户端的真实IP地址

[java] view plain copy

  1. public final class IPUtil {   
  2.   
  3.     /** 
  4.      * 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址; 
  5.      *  
  6.      * @param request 
  7.      * @return 
  8.      * @throws IOException 
  9.      */  
  10.     public final static String getIpAddress(HttpServletRequest request) throws IOException {  
  11.         // 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址  
  12.   
  13.         String ip = request.getHeader("X-Forwarded-For");  
  14.         if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
  15.             if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
  16.                 ip = request.getHeader("Proxy-Client-IP");  
  17.             }  
  18.             if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
  19.                 ip = request.getHeader("WL-Proxy-Client-IP");  
  20.             }  
  21.             if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
  22.                 ip = request.getHeader("HTTP_CLIENT_IP");  
  23.             }  
  24.             if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
  25.                 ip = request.getHeader("HTTP_X_FORWARDED_FOR");  
  26.             }  
  27.             if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
  28.                 ip = request.getRemoteAddr();  
  29.             }  
  30.         } else if (ip.length() > 15) {  
  31.             String[] ips = ip.split(",");  
  32.             for (int index = 0; index < ips.length; index++) {  
  33.                 String strIp = (String) ips[index];  
  34.                 if (!("unknown".equalsIgnoreCase(strIp))) {  
  35.                     ip = strIp;  
  36.                     break;  
  37.                 }  
  38.             }  
  39.         }  
  40.         return ip;  
  41.     }  
  42. }  

文章参考http://blog.csdn.net/yin_jw/article/details/24470131,真实可用。