java如何根據(jù)HttpServletRequest獲取IP地址
更新時間:2025年03月08日 13:56:34 作者:北極的企鵝88
文章介紹了幾種代理服務(wù)器轉(zhuǎn)發(fā)服務(wù)請求頭的方法,這些請求頭可能包含真實IP地址,但并不是所有的代理都會包括這些請求頭,而且這些IP地址可能被偽造
java根據(jù)HttpServletRequest獲取IP地址
解決辦法:
以下整理了各個代理服務(wù)器自己開發(fā)的轉(zhuǎn)發(fā)服務(wù)請求頭,這些請求頭都不是標(biāo)準(zhǔn)的http請求頭,不一定所有的代理都會帶上這些請求頭,所以通過這方式只能盡可能的獲取到真實ip,但不能保證一定可以獲取到真實ip,而且代理服務(wù)器請求頭中獲取的ip是可偽造的。
參數(shù):
X-Forwarded-For
:Squid 服務(wù)代理Proxy-Client-IP
:apache 服務(wù)代理WL-Proxy-Client-IP
:weblogic 服務(wù)代理HTTP_CLIENT_IP
:有些代理服務(wù)器X-Real-IP
:nginx服務(wù)代理
方法一
public static String getIPAddress(HttpServletRequest request) { String ip = null; //X-Forwarded-For:Squid 服務(wù)代理 String ipAddresses = request.getHeader("X-Forwarded-For"); if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) { //Proxy-Client-IP:apache 服務(wù)代理 ipAddresses = request.getHeader("Proxy-Client-IP"); } if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) { //WL-Proxy-Client-IP:weblogic 服務(wù)代理 ipAddresses = request.getHeader("WL-Proxy-Client-IP"); } if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) { //HTTP_CLIENT_IP:有些代理服務(wù)器 ipAddresses = request.getHeader("HTTP_CLIENT_IP"); } if (ipAddresses == null || ipAddresses.length() == 0 || "unknown".equalsIgnoreCase(ipAddresses)) { //X-Real-IP:nginx服務(wù)代理 ipAddresses = request.getHeader("X-Real-IP"); } //有些網(wǎng)絡(luò)通過多層代理,那么獲取到的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; }
方法二
public static String getIpAddr(HttpServletRequest request) { if (request == null) { return "unknown"; } 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("X-Forwarded-For"); } 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("X-Real-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : EscapeUtil.clean(ip); }
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot請求發(fā)送與信息響應(yīng)匹配實現(xiàn)方法介紹
這篇文章主要介紹了SpringBoot請求發(fā)送與信息響應(yīng)匹配實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-10-10WebUploader客戶端批量上傳圖片 后臺使用springMVC
這篇文章主要為大家詳細(xì)介紹了WebUploader客戶端批量上傳圖片,后臺使用springMVC接收實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-09-09Java簡單計時的實現(xiàn)案例(可以用來限時循環(huán))
這篇文章主要介紹了Java簡單計時的實現(xiàn)案例(可以用來限時循環(huán)),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08