透过防火墙获取真实IP地址
透过防火墙获取真实IP地址
使用 Nginx等反向代理软件, 则不能通过 request.getRemoteAddr()获取 IP地址
如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址
X-Forwarded-For中第一个非 unknown的有效IP字符串,则为真实IP地址
1 public static String getIP(HttpServletRequest request){ 2 // 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址 3 String ip = null; 4 try { 5 ip = request.getHeader("x-forwarded-for"); 6 if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 7 ip = request.getHeader("Proxy-Client-IP"); 8 } 9 if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 10 ip = request.getHeader("WL-Proxy-Client-IP"); 11 } 12 if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 13 ip = request.getHeader("HTTP_CLIENT_IP"); 14 } 15 if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 16 ip = request.getHeader("HTTP_X_FORWARDED_FOR"); 17 } 18 if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 19 ip = request.getRemoteAddr(); 20 if (ip.equals("127.0.0.1")) { 21 // 根据网卡取本机配置的IP 22 InetAddress inet = null; 23 try { 24 inet = InetAddress.getLocalHost(); 25 } catch (UnknownHostException e) { 26 log.error("抛出异常 # ", e); 27 } 28 ip = inet.getHostAddress(); 29 } 30 } 31 32 // 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割 33 if (ip != null && ip.length() > 15) { 34 if (ip.indexOf(",") > 0) { 35 ip = ip.substring(0, ip.indexOf(",")); 36 } 37 } 38 }catch (Exception ex) { 39 log.error("NetworkUtil # getIpAddress # 抛出异常 # ", ex); 40 } 41 return ip; 42 }

浙公网安备 33010602011771号