Java利用Request請(qǐng)求獲取IP地址的方法詳解
前言
最近在項(xiàng)目中遇到一個(gè)需求,是需要將不同省份的用戶,展示不同內(nèi)容,通過查找相關(guān)的資料,發(fā)現(xiàn)可以通過Request請(qǐng)求獲取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)){ //多次反向代理后會(huì)有多個(gè)ip值,第一個(gè)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 就是記錄請(qǐng)求的客戶端真實(shí)IP。跟X-Forwarded-For 類似。
Proxy-Client-IP 顧名思義就是代理客戶端的IP,如果客戶端真實(shí)IP獲取不到的時(shí)候,就只能獲取代理客戶端的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)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
java類實(shí)現(xiàn)日期的時(shí)間差的實(shí)例講解
在本篇文章里小編給大家整理的是一篇關(guān)于java類實(shí)現(xiàn)日期的時(shí)間差的實(shí)例講解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-01-01java中實(shí)現(xiàn)兼容ie6 7 8 9的spring4+websocket
這篇文章主要介紹了java中實(shí)現(xiàn)兼容ie6 7 8 9的spring4+websocket程序代碼,十分的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下。2015-06-06淺談Java內(nèi)存區(qū)域與對(duì)象創(chuàng)建過程
下面小編就為大家?guī)硪黄獪\談Java內(nèi)存區(qū)域與對(duì)象創(chuàng)建過程。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07解決Spring調(diào)用Feign報(bào)錯(cuò):java.io.IOException:Incomplete output
這篇文章主要介紹了解決Spring調(diào)用Feign報(bào)錯(cuò):java.io.IOException:Incomplete output stream問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04