如何獲取客戶端真實ip地址
阿新 • • 發佈:2019-01-05
在專案中需要獲取客戶端的真實IP地址,原本使用的是request.getRemoteAddr(),後來釋出到伺服器上時發現取到的值一直是127.0.0.1
原因是,在部署時用了nginx進行反向代理,
(小插曲:配nginx的時候一定要記得配 X-Real-IP和 X-Forwarded-For如下,不然還是取不到啊)
解決辦法:
經過代理以後,由於在客戶端和服務之間增加了中間層,因此伺服器無法直接拿到客戶端的IP,伺服器端應用也無法直接通過轉發請求的地址返回給客戶端。但是在轉發請求的HTTP頭資訊中,增加了 X-Real-IP和 X-Forwarded-For資訊。即可獲取。
參考:http://dpn525.iteye.com/blog/1132318public static String getIpAddress(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); String xip = request.getHeader("X-Real-IP"); if(ip != null && ip.length()!=0 && !ip.equalsIgnoreCase("unKnown")){ int index = ip.indexOf(","); if(index != -1){ return ip.substring(0,index); }else{ return ip; } } ip = xip; if(ip != null && ip.length()!=0 && !ip.equalsIgnoreCase("unKnown")){ return ip; } 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.getHeader("HTTP_CLIENT_IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_X_FORWARDED_FOR"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } return ip; }