成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java面試-如何獲取客戶端真實(shí)IP

網(wǎng)絡(luò) 通信技術(shù) 后端
針對分享,我們希望能根據(jù)各個(gè)城市或者地區(qū),能有不同的分享文案,辨識(shí)地區(qū)的功能如果由服務(wù)器來完成的話,我們就需要知道客戶端的真實(shí)IP。今天我們就來看看服務(wù)器是如何獲取到客戶端的真實(shí)IP的。

在進(jìn)行一些小游戲開發(fā)時(shí),我們經(jīng)常比較關(guān)注的一個(gè)功能便是分享。針對分享,我們希望能根據(jù)各個(gè)城市或者地區(qū),能有不同的分享文案,辨識(shí)地區(qū)的功能如果由服務(wù)器來完成的話,我們就需要知道客戶端的真實(shí)IP。今天我們就來看看服務(wù)器是如何獲取到客戶端的真實(shí)IP的。

[[280536]]

nginx配置

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

  1. location ^~ /your-service/ { 
  2. proxy_set_header X-Real-IP $remote_addr; 
  3. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
  4. proxy_pass http://localhost:60000/your-service/; 

1. X-Real-IP

在《實(shí)戰(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)然是沒法獲得用戶的真實(shí)ip的。但是,nginx是可以獲得用戶的真實(shí)ip的,也就是說nginx使用$remote_addr變量時(shí)獲得的是用戶的真實(shí)ip,如果我們想要在web端獲得用戶的真實(shí)ip,就必須在nginx里作一個(gè)賦值操作,即我在上面的配置:

  1. proxy_set_header X-Real-IP $remote_addr; 

2. X-Forwarded-For

X-Forwarded-For變量,這是一個(gè)squid開發(fā)的,用于識(shí)別通過HTTP代理或負(fù)載平衡器原始IP一個(gè)連接到Web服務(wù)器的客戶機(jī)地址的非rfc標(biāo)準(zhǔn),如果有做X-Forwarded-For設(shè)置的話,每次經(jīng)過proxy轉(zhuǎn)發(fā)都會(huì)有記錄,格式就是client1,proxy1,proxy2以逗號(hào)隔開各個(gè)地址,由于它是非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,如果我們想要通過這個(gè)變量獲得用戶的ip,我們需要自己在nginx添加配置:

  1. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

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

3. 那么$proxy_add_x_forwarded_for又是什么?

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

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

在第一臺(tái)nginx中,使用:

  1. 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變量的值就是用戶的真實(shí)的ip地址了。

到了第二臺(tái)nginx,使用:

  1. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

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

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

代碼為:

  1. public static String getIpAddress(HttpServletRequest request) { 
  2. String Xip = request.getHeader("X-Real-IP"); 
  3. String XFor = request.getHeader("X-Forwarded-For"); 
  4. if (!Strings.isNullOrEmpty(XFor) && !"unKnown".equalsIgnoreCase(XFor)) { 
  5. //多次反向代理后會(huì)有多個(gè)ip值,第一個(gè)ip才是真實(shí)ip 
  6. int index = XFor.indexOf(","); 
  7. if (index != -1) { 
  8. return XFor.substring(0, index); 
  9. } else { 
  10. return XFor; 
  11. XFor = Xip
  12. if (!Strings.isNullOrEmpty(XFor) && !"unKnown".equalsIgnoreCase(XFor)) { 
  13. return XFor; 
  14. if (Strings.nullToEmpty(XFor).trim().isEmpty() || "unknown".equalsIgnoreCase(XFor)) { 
  15. XFor = request.getHeader("Proxy-Client-IP"); 
  16. if (Strings.nullToEmpty(XFor).trim().isEmpty() || "unknown".equalsIgnoreCase(XFor)) { 
  17. XFor = request.getHeader("WL-Proxy-Client-IP"); 
  18. if (Strings.nullToEmpty(XFor).trim().isEmpty() || "unknown".equalsIgnoreCase(XFor)) { 
  19. XFor = request.getHeader("HTTP_CLIENT_IP"); 
  20. if (Strings.nullToEmpty(XFor).trim().isEmpty() || "unknown".equalsIgnoreCase(XFor)) { 
  21. XFor = request.getHeader("HTTP_X_FORWARDED_FOR"); 
  22. if (Strings.nullToEmpty(XFor).trim().isEmpty() || "unknown".equalsIgnoreCase(XFor)) { 
  23. XFor = request.getRemoteAddr(); 
  24. return XFor; 

我們來看看各個(gè)請求頭的含義:

  • X-Real-IP:nginx代理一般會(huì)加上此請求頭。
  • X-FORWARDED-FOR:這是一個(gè)Squid開發(fā)的字段,只有在通過了HTTP代理或者負(fù)載均衡服務(wù)器時(shí)才會(huì)添加該項(xiàng)。
  • Proxy-Client-IP 和 WL-Proxy-Client-IP:這個(gè)一般是經(jīng)過apache http服務(wù)器的請求才會(huì)有,用apache http做代理時(shí)一般會(huì)加上Proxy-Client-IP請求頭,而WL-Proxy-Client-IP是它的weblogic插件加上的頭。

HTTPCLIENTIP

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

這是普通的 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),也從來沒成為過事實(shí)標(biāo)準(zhǔn)。 (大家最熟悉的事實(shí)標(biāo)準(zhǔn)就是 x-forwarded-for) 后來出現(xiàn)的 web proxy 也沒見用過這個(gè) header。 TCP/IP Illustrated Vol 3 沒有講過這個(gè) header,網(wǎng)上的傳言不可信。 可考的最早痕跡出現(xiàn)在2005年,日本一部 Perl/CGI 秘籍(9784798010779,270頁)通過 client-ip 與 via 兩個(gè) header 屏蔽代理用戶訪問。

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

 

責(zé)任編輯:趙寧寧 來源: 今日頭條
相關(guān)推薦

2023-11-15 13:50:07

服務(wù)端IP

2018-12-19 10:31:32

客戶端IP服務(wù)器

2011-11-30 15:43:40

JavaJSP

2009-12-08 16:47:06

WCF IP

2010-02-22 11:10:17

WCF獲取客戶端IP

2009-12-21 15:53:56

WCF獲取客戶端IP

2010-12-21 11:03:15

獲取客戶端證書

2010-02-24 16:17:09

WCF獲取客戶端IP

2011-08-25 13:42:57

IP隧道IPIPGRE

2010-08-31 16:29:40

DHCP客戶端

2009-12-03 10:09:47

PHP獲取客戶端IP

2024-05-06 08:00:00

C#IP地址

2013-03-13 10:51:44

瘦客戶端VDI

2010-12-31 14:23:57

Exchange Se

2021-09-22 15:46:29

虛擬桌面瘦客戶端胖客戶端

2011-08-17 10:10:59

2010-12-17 10:16:33

OpenVAS

2014-08-11 16:35:35

KafkaJava客戶端

2011-03-24 13:00:31

配置nagios客戶端

2011-03-02 14:36:24

Filezilla客戶端
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产精品久久久久久一区二区三区 | 午夜影院污| 中文日韩在线视频 | 91精品国产色综合久久不卡98 | 亚洲激精日韩激精欧美精品 | 国偷自产av一区二区三区 | 欧美激情视频一区二区三区在线播放 | 天天干精品 | 手机看片在线播放 | 最新中文在线视频 | 91色网站| av国产精品 | 国产99精品 | 精品国产91 | 午夜精品久久久久久久久久久久久 | 成人午夜av | 久久久国产精品 | 白浆在线 | 色毛片| 91青娱乐在线 | 日本精品视频在线 | 一级在线视频 | 日韩免费看视频 | 四虎影院欧美 | 亚洲综合网站 | 久久综合久 | 国产精品夜夜春夜夜爽久久电影 | 欧美国产精品一区二区 | 亚洲成人国产精品 | 美女一区二区在线观看 | 二区精品 | 一区二区三区在线 | 欧 | 午夜小视频免费观看 | 亚洲成人综合在线 | 欧美日韩不卡 | 亚洲一区久久 | 日本精品在线一区 | 99久久久久国产精品免费 | 亚洲一区二区免费 | 午夜精品视频在线观看 | 国产激情一区二区三区 |