Java利用Request請求獲取IP地址的方法詳解
前言
最近在項(xiàng)目中遇到一個需求,是需要將不同省份的用戶,展示不同內(nèi)容,通過查找相關(guān)的資料,發(fā)現(xiàn)可以通過Request請求獲取IP地址,下面我們先來貼代碼, 如果你要在生產(chǎn)環(huán)境使用就直接拿去用吧,我這邊已經(jīng)上線了。
示例代碼
public class IpAdrressUtil {
/**
* 獲取Ip地址
* @param request
* @return
*/
private static String getIpAdrress(HttpServletRequest request) {
String Xip = request.getHeader("X-Real-IP");
String XFor = request.getHeader("X-Forwarded-For");
if(StringUtils.isNotEmpty(XFor) && !"unKnown".equalsIgnoreCase(XFor)){
//多次反向代理后會有多個ip值,第一個ip才是真實(shí)ip
int index = XFor.indexOf(",");
if(index != -1){
return XFor.substring(0,index);
}else{
return XFor;
}
}
XFor = Xip;
if(StringUtils.isNotEmpty(XFor) && !"unKnown".equalsIgnoreCase(XFor)){
return XFor;
}
if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
XFor = request.getHeader("Proxy-Client-IP");
}
if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
XFor = request.getHeader("WL-Proxy-Client-IP");
}
if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
XFor = request.getHeader("HTTP_CLIENT_IP");
}
if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
XFor = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
XFor = request.getRemoteAddr();
}
return XFor;
}
}
代碼詳解
首先,我們獲取 X-Forwarded-For 中第0位的IP地址,它就是在HTTP擴(kuò)展協(xié)議中能表示真實(shí)的客戶端IP。具體就像這樣:
X-Forwarded-For: client, proxy1, proxy2,proxy…
所以你應(yīng)該知道為什么要取第0位了吧!
如果 X-Forwarded-For 獲取不到,就去獲取X-Real-IP ,X-Real-IP 獲取不到,就依次獲取Proxy-Client-IP 、WL-Proxy-Client-IP 、HTTP_CLIENT_IP 、 HTTP_X_FORWARDED_FOR 。最后獲取不到才通過request.getRemoteAddr()獲取IP,
X-Real-IP 就是記錄請求的客戶端真實(shí)IP。跟X-Forwarded-For 類似。
Proxy-Client-IP 顧名思義就是代理客戶端的IP,如果客戶端真實(shí)IP獲取不到的時候,就只能獲取代理客戶端的IP了。
WL-Proxy-Client-IP 是在Weblogic下獲取真實(shí)IP所用的的參數(shù)。
HTTP_CLIENT_IP 與 HTTP_X_FORWARDED_FOR 可以理解為X-Forwarded-For , 因?yàn)樗鼈兪荘HP中的用法。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
詳解Java的JDBC API的存儲過程與SQL轉(zhuǎn)義語法的使用
這篇文章主要介紹了詳解Java的JDBC API的存儲過程與SQL轉(zhuǎn)義語法的使用,JDBC是Java用于連接使用各種數(shù)據(jù)庫的API,需要的朋友可以參考下2015-12-12
java 刪除數(shù)組元素與刪除重復(fù)數(shù)組元素的代碼
在java中刪除數(shù)組元素與過濾重復(fù)數(shù)組元素我們都會需要去遍歷數(shù)組然后根據(jù)我們設(shè)置的值或方法進(jìn)行去除數(shù)組2013-10-10
Java中String類(字符串操作)的10個常見問題和解決方法
這篇文章主要介紹了Java中String類(字符串)操作的10個常見問題,需要的朋友可以參考下2014-04-04
Java SimpleDateFormat中英文時間格式化轉(zhuǎn)換詳解
這篇文章主要為大家詳細(xì)介紹了Java SimpleDateFormat中英文時間格式化轉(zhuǎn)換,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-12-12
Java中Redis存儲String類型會有亂碼的問題及解決方案
在java中使用Redis存儲String類型的數(shù)據(jù)時,會出現(xiàn)亂碼,我寫了一條存儲key為name,值為虎哥的字符串,然后獲取一下這個key為name的值,打印得到的值,下面通過實(shí)例代碼介紹Java中Redis存儲String類型會有亂碼的問題及解決方案,一起看看吧2024-04-04
MyBatis Generator配置生成接口和XML映射文件的實(shí)現(xiàn)
本文介紹了配置MBG以生成Mapper接口和XML映射文件,過合理使用MBG和自定義生成策略,可以有效解決生成的Example類可能帶來的問題,使代碼更加簡潔和易于維護(hù)2025-02-02
Java命令設(shè)計模式優(yōu)雅解耦命令和執(zhí)行提高代碼可維護(hù)性
本文介紹了Java命令設(shè)計模式,它將命令請求封裝成對象,以達(dá)到解耦命令請求和執(zhí)行者的目的,從而提高代碼可維護(hù)性。本文詳細(xì)闡述了該模式的設(shè)計原則、實(shí)現(xiàn)方法和優(yōu)缺點(diǎn),并提供了實(shí)際應(yīng)用場景和代碼示例,幫助讀者深入理解和應(yīng)用該模式2023-04-04

