透过防火墙获取真实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 }

 

posted @ 2021-06-21 14:25  WDNDNDYD  阅读(788)  评论(0)    收藏  举报
//注意:由于浏览器的跨域限制,对于自行引入的看板娘js应当使用cdn(推荐使用jsDeliver+Github方式) // //