真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Java中如何獲取客戶端真實IP-創(chuàng)新互聯(lián)

今天就跟大家聊聊有關(guān)Java中如何獲取客戶端真實IP,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

創(chuàng)新互聯(lián)公司客戶idc服務(wù)中心,提供成都移動機(jī)房、成都服務(wù)器、成都主機(jī)托管、成都雙線服務(wù)器等業(yè)務(wù)的一站式服務(wù)。通過各地的服務(wù)中心,我們向成都用戶提供優(yōu)質(zhì)廉價的產(chǎn)品以及開放、透明、穩(wěn)定、高性價比的服務(wù),資深網(wǎng)絡(luò)工程師在機(jī)房提供7*24小時標(biāo)準(zhǔn)級技術(shù)保障。
Java中如何獲取客戶端真實IP

nginx配置

首先,一個請求肯定是可以分為請求頭和請求體的,而我們客戶端的IP地址信息一般都是存儲在請求頭里的。如果你的服務(wù)器有用Nginx做負(fù)載均衡的話,你需要在你的location里面配置X-Real-IP和X-Forwarded-For請求頭:

location ^~ /your-service/ { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://localhost:60000/your-service/; }

1. X-Real-IP

在《實戰(zhàn)nginx》中,有這么一句話:

經(jīng)過反向代理后,由于在客戶端和web服務(wù)器之間增加了中間層,因此web服務(wù)器無法直接拿到客戶端的ip,通過$remote_addr變量拿到的將是反向代理服務(wù)器的ip地址。

這句話的意思是說,當(dāng)你使用了nginx反向服務(wù)器后,在web端使用request.getRemoteAddr()(本質(zhì)上就是獲取$remote_addr),取得的是nginx的地址,即$remote_addr變量中封裝的是nginx的地址,當(dāng)然是沒法獲得用戶的真實ip的。但是,nginx是可以獲得用戶的真實ip的,也就是說nginx使用$remote_addr變量時獲得的是用戶的真實ip,如果我們想要在web端獲得用戶的真實ip,就必須在nginx里作一個賦值操作,即我在上面的配置:

proxy_set_header X-Real-IP $remote_addr;

2. X-Forwarded-For

X-Forwarded-For變量,這是一個squid開發(fā)的,用于識別通過HTTP代理或負(fù)載平衡器原始IP一個連接到Web服務(wù)器的客戶機(jī)地址的非rfc標(biāo)準(zhǔn),如果有做X-Forwarded-For設(shè)置的話,每次經(jīng)過proxy轉(zhuǎn)發(fā)都會有記錄,格式就是client1,proxy1,proxy2以逗號隔開各個地址,由于它是非rfc標(biāo)準(zhǔn),所以默認(rèn)是沒有的,需要強(qiáng)制添加。在默認(rèn)情況下經(jīng)過proxy轉(zhuǎn)發(fā)的請求,在后端看來遠(yuǎn)程地址都是proxy端的ip 。也就是說在默認(rèn)情況下我們使用request.getAttribute("X-Forwarded-For")獲取不到用戶的ip,如果我們想要通過這個變量獲得用戶的ip,我們需要自己在nginx添加配置:

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

意思是增加一個$proxy_add_x_forwarded_for到X-Forwarded-For里去,注意是增加,而不是覆蓋,當(dāng)然由于默認(rèn)的X-Forwarded-For值是空的,所以我們總感覺X-Forwarded-For的值就等于$proxy_add_x_forwarded_for的值,實際上當(dāng)你搭建兩臺nginx在不同的ip上,并且都使用了這段配置,那你會發(fā)現(xiàn)在web服務(wù)器端通過request.getAttribute("X-Forwarded-For")獲得的將會是客戶端ip和第一臺nginx的ip。

3. 那么$proxy_add_x_forwarded_for又是什么?

$proxy_add_x_forwarded_for變量包含客戶端請求頭中的X-Forwarded-For與$remote_addr兩部分,他們之間用逗號分開。

舉個例子,有一個web應(yīng)用,在它之前通過了兩個nginx轉(zhuǎn)發(fā),www.linuxidc.com即用戶訪問該web通過兩臺nginx。

在第一臺nginx中,使用:

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

現(xiàn)在的$proxy_add_x_forwarded_for變量的X-Forwarded-For部分是空的,所以只有$remote_addr,而$remote_addr的值是用戶的ip,于是賦值以后,X-Forwarded-For變量的值就是用戶的真實的ip地址了。

到了第二臺nginx,使用:

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

現(xiàn)在的$proxy_add_x_forwarded_for變量,X-Forwarded-For部分包含的是用戶的真實ip,$remote_addr部分的值是上一臺nginx的ip地址,于是通過這個賦值以后現(xiàn)在的X-Forwarded-For的值就變成了“用戶的真實ip,第一臺nginx的ip”,這樣就清楚了吧。

服務(wù)器獲取真實IP

代碼為:

public static String getIpAddress(HttpServletRequest request) { String Xip = request.getHeader("X-Real-IP"); String XFor = request.getHeader("X-Forwarded-For"); if (!Strings.isNullOrEmpty(XFor) && !"unKnown".equalsIgnoreCase(XFor)) { //多次反向代理后會有多個ip值,第一個ip才是真實ip int index = XFor.indexOf(","); if (index != -1) { return XFor.substring(0, index); } else { return XFor; } } XFor = Xip; if (!Strings.isNullOrEmpty(XFor) && !"unKnown".equalsIgnoreCase(XFor)) { return XFor; } if (Strings.nullToEmpty(XFor).trim().isEmpty() || "unknown".equalsIgnoreCase(XFor)) { XFor = request.getHeader("Proxy-Client-IP"); } if (Strings.nullToEmpty(XFor).trim().isEmpty() || "unknown".equalsIgnoreCase(XFor)) { XFor = request.getHeader("WL-Proxy-Client-IP"); } if (Strings.nullToEmpty(XFor).trim().isEmpty() || "unknown".equalsIgnoreCase(XFor)) { XFor = request.getHeader("HTTP_CLIENT_IP"); } if (Strings.nullToEmpty(XFor).trim().isEmpty() || "unknown".equalsIgnoreCase(XFor)) { XFor = request.getHeader("HTTP_X_FORWARDED_FOR"); } if (Strings.nullToEmpty(XFor).trim().isEmpty() || "unknown".equalsIgnoreCase(XFor)) { XFor = request.getRemoteAddr(); } return XFor; }

我們來看看各個請求頭的含義:

X-Real-IP:nginx代理一般會加上此請求頭。

X-FORWARDED-FOR:這是一個Squid開發(fā)的字段,只有在通過了HTTP代理或者負(fù)載均衡服務(wù)器時才會添加該項。

Proxy-Client-IP 和 WL-Proxy-Client-IP:這個一般是經(jīng)過apache http服務(wù)器的請求才會有,用apache http做代理時一般會加上Proxy-Client-IP請求頭,而WL-Proxy-Client-IP是它的weblogic插件加上的頭。

HTTPCLIENTIP

有些代理服務(wù)器會加上此請求頭。在網(wǎng)上搜了一下,有一個說法是:

這是普通的 http header,偽造起來很容易,不要輕易信任用戶輸入。 curl -H 'client-ip: 8.8.8.8' lidian.club/phpinfo.php | grep _SERVER 你就能看到 _SERVER["HTTP_CLIENT_IP"] 了。 client-ip 和 client-host 是在 NAPT 還沒普及的年代,企業(yè)內(nèi)網(wǎng)假設(shè)的 http 透明代理,傳給服務(wù)器的 header,只有極少數(shù)廠家用過,從來不是標(biāo)準(zhǔn),也從來沒成為過事實標(biāo)準(zhǔn)。 (大家最熟悉的事實標(biāo)準(zhǔn)就是 x-forwarded-for) 后來出現(xiàn)的 web proxy 也沒見用過這個 header。 TCP/IP Illustrated Vol 3 沒有講過這個 header,網(wǎng)上的傳言不可信。 可考的最早痕跡出現(xiàn)在2005年,日本一部 Perl/CGI 秘籍(9784798010779,270頁)通過 client-ip 與 via 兩個 header 屏蔽代理用戶訪問。

簡稱XFF頭,它代表客戶端,也就是HTTP的請求端真實的IP,只有在通過了HTTP 代理(比如APACHE代理)或者負(fù)載均衡服務(wù)器時才會添加該項。它不是RFC中定義的標(biāo)準(zhǔn)請求頭信息,在squid緩存代理服務(wù)器開發(fā)文檔中可以找到該項的詳細(xì)介紹。如果有該條信息, 說明您使用了代理服務(wù)器,地址就是后面的數(shù)值??梢詡卧?。

看完上述內(nèi)容,你們對Java中如何獲取客戶端真實IP有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道,感謝大家的支持。


網(wǎng)頁名稱:Java中如何獲取客戶端真實IP-創(chuàng)新互聯(lián)
鏈接地址:http://weahome.cn/article/gisss.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部