package cn.chnmuseum.party.common.util; import java.net.InetAddress; import java.net.UnknownHostException; import javax.servlet.http.HttpServletRequest; public class NetWorkUtil { public static String getLoggableAddress(HttpServletRequest request) { if (request == null) { return null; } // X-Forwarded-For:Squid 服务代理 String ipAddress = request.getHeader("X-Forwarded-For"); if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { // Proxy-Client-IP:apache 服务代理 ipAddress = request.getHeader("Proxy-Client-IP"); } if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { // WL-Proxy-Client-IP:weblogic 服务代理 ipAddress = request.getHeader("WL-Proxy-Client-IP"); } if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { // HTTP_CLIENT_IP:有些代理服务器 ipAddress = request.getHeader("HTTP_CLIENT_IP"); } if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { // X-Real-IP:nginx服务代理 ipAddress = request.getHeader("X-Real-IP"); } if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { ipAddress = request.getHeader("HTTP_X_FORWARDED_FOR"); } // 有些网络通过多层代理(路由),那么获取到的ip就会有多个,一般都是通过逗号(,)分割开来,并且第一个ip为客户端的真实IP if (ipAddress != null && ipAddress.length() != 0) { // 多个时,取第一个非unknown的ip final String[] arr = ipAddress.split(","); for (final String str : arr) { if (!"unknown".equalsIgnoreCase(str)) { ipAddress = str; break; } } } if (("127.0.0.1").equals(ipAddress) || ("0:0:0:0:0:0:0:1".equals(ipAddress))) { // 根据网卡取本机配置的IP InetAddress inet = null; try { inet = InetAddress.getLocalHost(); } catch (UnknownHostException e) { e.printStackTrace(); } ipAddress = inet.getHostAddress(); } // 还是不能获取到,最后再通过request.getRemoteAddr();获取 if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) { ipAddress = request.getRemoteAddr(); } return ipAddress; } }