成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

干貨:Java正確獲取客戶端真實(shí)IP方法整理

felix0913 / 2883人閱讀

摘要:但是在通過(guò)了,等反向代理軟件就不能獲取到客戶端的真實(shí)地址了。下面是一個(gè)參考獲取客戶端地址的方法如果使用的是連接池,可以參考使用方法,但這個(gè)是經(jīng)過(guò)多級(jí)代理的地址,需要自己處理下獲取第一個(gè)。

在JSP里,獲取客戶端的IP地址的方法是:request.getRemoteAddr(),這種方法在大部分情況下都是有效的。但是在通過(guò)了Apache,Squid等反向代理軟件就不能獲取到客戶端的真實(shí)IP地址了。

如果使用了反向代理軟件,將http://192.168.1.110:2046/的URL反向代理為http://www.abc.com/的URL時(shí),用request.getRemoteAddr()方法獲取的IP地址是:127.0.0.1或192.168.1.110,而并不是客戶端的真實(shí)IP。

經(jīng)過(guò)代理以后,由于在客戶端和服務(wù)之間增加了中間層,因此服務(wù)器無(wú)法直接拿到客戶端的IP,服務(wù)器端應(yīng)用也無(wú)法直接通過(guò)轉(zhuǎn)發(fā)請(qǐng)求的地址返回給客戶端。但是在轉(zhuǎn)發(fā)請(qǐng)求的HTTP頭信息中,增加了X-FORWARDED-FOR信息。用以跟蹤原有的客戶端IP地址和原來(lái)客戶端請(qǐng)求的服務(wù)器地址。

當(dāng)我們?cè)L問(wèn)http://www.abc.com/index.jsp/時(shí),其實(shí)并不是我們?yōu)g覽器真正訪問(wèn)到了服務(wù)器上的index.jsp文件,而是先由代理服務(wù)器去訪問(wèn)http://192.168.1.110:2046/index.jsp,代理服務(wù)器再將訪問(wèn)到的結(jié)果返回給我們的瀏覽器,因?yàn)槭谴矸?wù)器去訪問(wèn)index.jsp的,所以index.jsp中通過(guò)request.getRemoteAddr()的方法獲取的IP實(shí)際上是代理服務(wù)器的地址,并不是客戶端的IP地址。

外界流傳的JAVA/PHP服務(wù)器端獲取客戶端IP都是這么取的:

偽代碼:

1)ip = request.getHeader("X-FORWARDED-FOR ")

2)如果該值為空或數(shù)組長(zhǎng)度為0或等于"unknown",那么:
ip = request.getHeader("Proxy-Client-IP")

3)如果該值為空或數(shù)組長(zhǎng)度為0或等于"unknown",那么:
ip = request.getHeader("WL-Proxy-Client-IP")

4)如果該值為空或數(shù)組長(zhǎng)度為0或等于"unknown",那么:
ip = request.getHeader("HTTP_CLIENT_IP")

5)如果該值為空或數(shù)組長(zhǎng)度為0或等于"unknown",那么:
ip = request.getHeader("X-Real-IP")

6)如果該值為空或數(shù)組長(zhǎng)度為0或等于"unknown",那么:
ip = request.getRemoteAddr ()

先說(shuō)說(shuō)這些請(qǐng)求頭的意思

X-Forwarded-For

這是一個(gè) Squid 開發(fā)的字段,只有在通過(guò)了HTTP代理或者負(fù)載均衡服務(wù)器時(shí)才會(huì)添加該項(xiàng)。

格式為X-Forwarded-For:client1,proxy1,proxy2,一般情況下,第一個(gè)ip為客戶端真實(shí)ip,后面的為經(jīng)過(guò)的代理服務(wù)器ip?,F(xiàn)在大部分的代理都會(huì)加上這個(gè)請(qǐng)求頭。

Proxy-Client-IP/WL- Proxy-Client-IP

這個(gè)一般是經(jīng)過(guò)apache http服務(wù)器的請(qǐng)求才會(huì)有,用apache http做代理時(shí)一般會(huì)加上Proxy-Client-IP請(qǐng)求頭,而WL-Proxy-Client-IP是他的weblogic插件加上的頭。

HTTP_CLIENT_IP

有些代理服務(wù)器會(huì)加上此請(qǐng)求頭。

X-Real-IP

nginx代理一般會(huì)加上此請(qǐng)求頭。

下面是一個(gè)參考獲取客戶端IP地址的方法:

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;
    }
}
如果使用的是Druid連接池,可以參考使用:com.alibaba.druid.util.DruidWebUtils#getRemoteAddr方法,但這個(gè)是經(jīng)過(guò)多級(jí)代理的IP地址,需要自己處理下獲取第一個(gè)。

有幾點(diǎn)要注意

這些請(qǐng)求頭都不是http協(xié)議里的標(biāo)準(zhǔn)請(qǐng)求頭,也就是說(shuō)這個(gè)是各個(gè)代理服務(wù)器自己規(guī)定的表示客戶端地址的請(qǐng)求頭。如果哪天有一個(gè)代理服務(wù)器軟件用oooo-client-ip這個(gè)請(qǐng)求頭代表客戶端請(qǐng)求,那上面的代碼就不行了。

這些請(qǐng)求頭不是代理服務(wù)器一定會(huì)帶上的,網(wǎng)絡(luò)上的很多匿名代理就沒(méi)有這些請(qǐng)求頭,所以獲取到的客戶端ip不一定是真實(shí)的客戶端ip。代理服務(wù)器一般都可以自定義請(qǐng)求頭設(shè)置。

即使請(qǐng)求經(jīng)過(guò)的代理都會(huì)按自己的規(guī)范附上代理請(qǐng)求頭,上面的代碼也不能確保獲得的一定是客戶端ip。不同的網(wǎng)絡(luò)架構(gòu),判斷請(qǐng)求頭的順序是不一樣的。

最重要的一點(diǎn),請(qǐng)求頭都是可以偽造的。如果一些對(duì)客戶端校驗(yàn)較嚴(yán)格的應(yīng)用(比如投票)要獲取客戶端ip,應(yīng)該直接使用ip=request.getRemoteAddr(),雖然獲取到的可能是代理的ip而不是客戶端的ip,但這個(gè)獲取到的ip基本上是不可能偽造的,也就杜絕了刷票的可能。(有分析說(shuō)arp欺騙+syn有可能偽造此ip,如果真的可以,這是所有基于TCP協(xié)議都存在的漏洞),這個(gè)ip是tcp連接里的ip。

參考
http://blog.csdn.net/sgx42502...
http://blog.csdn.net/fengwind...

推薦:成為架構(gòu)師的十階段學(xué)習(xí)資料

推薦:Spring Boot & Cloud 最強(qiáng)技術(shù)教程

如果對(duì)你有用,歡迎分享到朋友圈

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/71372.html

相關(guān)文章

  • Java后端

    摘要:,面向切面編程,中最主要的是用于事務(wù)方面的使用。目標(biāo)達(dá)成后還會(huì)有去構(gòu)建微服務(wù),希望大家多多支持。原文地址手把手教程優(yōu)雅的應(yīng)用四手把手實(shí)現(xiàn)后端搭建第四期 SpringMVC 干貨系列:從零搭建 SpringMVC+mybatis(四):Spring 兩大核心之 AOP 學(xué)習(xí) | 掘金技術(shù)征文 原本地址:SpringMVC 干貨系列:從零搭建 SpringMVC+mybatis(四):Sp...

    joyvw 評(píng)論0 收藏0
  • 到底什么是重入鎖,拜托,一次搞清楚!

    摘要:為什么叫重入鎖呢,我們把它拆開來(lái)看就明了了。釋放鎖,每次鎖持有者數(shù)量遞減,直到為止。 相信大家在工作或者面試過(guò)程中經(jīng)常聽到重入鎖這個(gè)概念,或者與關(guān)鍵字 synchrozied 的對(duì)比,棧長(zhǎng)面試了這么多人,80%的面試者都沒(méi)有答對(duì)或沒(méi)有答到點(diǎn)上,或者把雙重效驗(yàn)鎖搞混了,哭笑不得。。 那么你對(duì)重入鎖了解有多少呢?今天,棧長(zhǎng)幫大家撕開重入鎖的面紗,來(lái)見識(shí)下重入鎖的真實(shí)容顏。。 什么是重入鎖 ...

    LiuRhoRamen 評(píng)論0 收藏0
  • web后臺(tái) - 收藏集 - 掘金

    摘要:請(qǐng)欣賞手把手教程后端博客系統(tǒng)文章系統(tǒng)掘金本期主要是文章保存功能,涉及到草稿文章發(fā)布?xì)v史這三個(gè)要點(diǎn)。一談?wù)勥B接管理后端掘金連接管理概述最近重讀了權(quán)威指南部分章節(jié),結(jié)合來(lái)對(duì)部分內(nèi)容進(jìn)行印證并記錄下來(lái)。 Spring Boot干貨系列:(四)開發(fā)Web應(yīng)用之Thymeleaf篇 | 掘金技術(shù)征文 - 掘金原文地址:Spring Boot干貨系列:(四)開發(fā)Web應(yīng)用之Thymeleaf篇博客...

    Me_Kun 評(píng)論0 收藏0
  • Java核心技術(shù)教程整理,長(zhǎng)期更新

    以下是Java技術(shù)棧微信公眾號(hào)發(fā)布的關(guān)于 Java 的技術(shù)干貨,從以下幾個(gè)方面匯總。 Java 基礎(chǔ)篇 Java 集合篇 Java 多線程篇 Java JVM篇 Java 進(jìn)階篇 Java 新特性篇 Java 工具篇 Java 書籍篇 Java基礎(chǔ)篇 8張圖帶你輕松溫習(xí) Java 知識(shí) Java父類強(qiáng)制轉(zhuǎn)換子類原則 一張圖搞清楚 Java 異常機(jī)制 通用唯一標(biāo)識(shí)碼UUID的介紹及使用 字符串...

    Anchorer 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<