通常做好AP Server後,會有一台Web Server做Proxypass代理減少附載平衡
但是通常經過一層之後,request header也就會有改變,
造成AP得到的getRemoteAddr都是Web Server的ip
所以Java攔截器層可以增加以下方式來記錄真實Client IP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public static String getIpAddress(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); 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.getRemoteAddr(); } if (ip.contains(",")) { return ip.split(",")[0]; } else { return ip; } } |
Request Header參數說明
- X-Forwarded-For
這是一個 Squid 開發的字段,只有在通過了HTTP代理或者負載均衡服務器時才會添加該項。
格式為X-Forwarded-For:client1,proxy1,proxy2,一般情況下,第一個ip為客戶端真實ip,後面的為經過的代理服務器ip。現在大部分的代理都會加上這個請求頭。
- Proxy-Client-IP/WL- Proxy-Client-IP
這個一般是經過apache http服務器的請求才會有,用apache http做代理時一般會加上Proxy-Client-IP請求頭,而WL-Proxy-Client-IP是他的weblogic插件加上的頭。
- HTTP_CLIENT_IP
有些代理服務器會加上此請求頭。
- X-Real-IP
nginx代理一般會加上此請求頭。
Reference
https://www.itread01.com/content/1532062937.html