根據HttpServletRequest獲取用戶真實IP地址


 

原因:

 

當我們通過request獲取客戶端IP時,自身服務器通常會為了保護信息或者負載均衡的目的,對自身服務器做反向代理。此時如果我們通過request.getRemoteAddr();可能獲取到的是自身代理服務器的IP,而無法達到獲取用戶請求ip的目的。

 

解決辦法:

 

以下整理了各個代理服務器自己開發的轉發服務請求頭,這些請求頭都不是標准的http請求頭,不一定所有的代理都會帶上這些請求頭,所以通過這方式只能盡可能的獲取到真實ip,但不能保證一定可以獲取到真實ip,而且代理服務器請求頭中獲取的ip是可偽造的。

 

參數:

 

X-Forwarded-For:Squid 服務代理

 

Proxy-Client-IP:apache 服務代理

 

WL-Proxy-Client-IP:weblogic 服務代理

 

HTTP_CLIENT_IP:有些代理服務器

 

X-Real-IP:nginx服務代理

 

public static String getIPAddress(HttpServletRequest request) {
    String ip = null;

//X-Forwarded-For:Squid 服務代理 String ipAddresses
= request.getHeader("X-Forwarded-For");
if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
//Proxy-Client-IP:apache 服務代理 ipAddresses
= request.getHeader("Proxy-Client-IP"); }
if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
//WL-Proxy-Client-IP:weblogic 服務代理 ipAddresses
= request.getHeader("WL-Proxy-Client-IP"); }
if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
//HTTP_CLIENT_IP:有些代理服務器 ipAddresses
= request.getHeader("HTTP_CLIENT_IP"); }
if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) {
//X-Real-IP:nginx服務代理 ipAddresses
= request.getHeader("X-Real-IP"); }

//有些網絡通過多層代理,那么獲取到的ip就會有多個,一般都是通過逗號(,)分割開來,並且第一個ip為客戶端的真實IP
if (ipAddresses != null && ipAddresses.length() != 0) { ip = ipAddresses.split(",")[0]; }

//還是不能獲取到,最后再通過request.getRemoteAddr();獲取
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) { ip = request.getRemoteAddr(); } return ip; }

 

 

遺留問題:

windows平台測試通過,linux未知。

2017-09-05   23:38:06


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM