日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

apache代理时java获取IP的问题

發布時間:2025/1/21 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 apache代理时java获取IP的问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

x-forwarded-for的深度挖掘

如今利用nginx做負載均衡的實例已經很多了,針對不同的應用場合,還有很多需要注意的地方,本文要說的就是在通過CDN 后到達nginx做負載均衡時請求頭中的X-Forwarded-For項到底發生了什么變化。下圖為簡單的web架構圖:

?

?

?

?

?

先來看一下X-Forwarded-For的定義:
X-Forwarded-For:簡稱XFF頭,它代表客戶端,也就是HTTP的請求端真實的IP,只有在通過了HTTP 代理或者負載均衡服務器時才會添加該項。它不是RFC中定義的標準請求頭信息,在squid緩存代理服務器開發文檔中可以找到該項的詳細介紹。
標準格式如下:
X-Forwarded-For: client1, proxy1, proxy2
從標準格式可以看出,X-Forwarded-For頭信息可以有多個,中間用逗號分隔,第一項為真實的客戶端ip,剩下的就是曾經經過的代理或負載均衡的ip地址,經過幾個就會出現幾個。

按照上圖的Web架構圖,可以很容易的看出,當用戶請求經過CDN后到達Nginx負載均衡服務器時,其X-Forwarded-For頭信息應該為客戶端IP,CDN的IP。但實際情況并非如此,一般情況下CDN服務商為了自身安全考慮會將這個信息做些改動,只保留客戶端IP。我們可以通過php程序獲得X-Forwarded-For信息或者通過Nginx的add header方法來設置返回頭來查看。

下面來分析請求頭到達Nginx負載均衡服務器的情況;在默認情況下,Nginx并不會對X-Forwarded-For頭做任何的處理,除非用戶使用proxy_set_header 參數設置:
proxy_set_header??????? X-Forwarded-For $proxy_add_x_forwarded_for;

$proxy_add_x_forwarded_for變量包含客戶端請求頭中的"X-Forwarded-For",與$remote_addr用逗號分開,如果沒有"X-Forwarded-For" 請求頭,則$proxy_add_x_forwarded_for等于$remote_addr。

$remote_addr變量的值是客戶端的IP

當Nginx設置X-Forwarded-For等于$proxy_add_x_forwarded_for后會有兩種情況發生

1、如果從CDN過來的請求沒有設置X-Forwarded-For頭(通常這種事情不會發生),而到了我們這里Nginx設置將其設置為$proxy_add_x_forwarded_for的話,X-Forwarded-For的信息應該為CDN的IP,因為相對于Nginx負載均衡來說客戶端即為CDN,這樣的話,后端的web程序時死活也獲得不了真實用戶的IP的。

2、CDN設置了X-Forwarded-For,我們這里又設置了一次,且值為$proxy_add_x_forwarded_for的話,那么X-Forwarded-For的內容變成 ”客戶端IP,Nginx負載均衡服務器IP“如果是這種情況的話,那后端的程序通過X-Forwarded-For獲得客戶端IP,則取逗號分隔的第一項即可

如上兩點所說,如果我們知道了CDN設置了X-Forwarded-For信息,且只有客戶端真實的IP的話,那么我們的Nginx負載均衡服務器可以不必理會該頭,讓它默認即可。

其實Nginx中還有一個$http_x_forwarded_for變量,這個變量中保存的內容就是請求中的X-Forwarded-For信息。如果后端獲得X-Forwarded-For信息的程序兼容性不好的話(沒有考慮到X-Forwarded-For含有多個IP的情況),最好就不要將X-Forwarded-For設置為$proxy_add_x_forwarded_for。應該設置為$http_x_forwarded_for或者干脆不設置!

參考文章:http://en.wikipedia.org/wiki/X-Forwarded-For

轉自:http://www.cnblogs.com/yihang/archive/2010/12/19/1910365.html

java獲取IP地址的方法:

在我的項目中使用到了apache代理軟件,所以最后我經過request.getRemoteAddr()得到都是127.0.0.1,我們得到的是代理軟件的服務器地址。真實的應該是如下:

?public?String?getIpAddr(HttpServletRequest?request)?{
?2????????String?ip?=?request.getHeader("x-forwarded-for"
);
?3????????if(ip?==?null?||?ip.length()?==??||?"unknown".equalsIgnoreCase(ip))?
{
?4????????????ip?=?request.getHeader("Proxy-Client-IP"
);
?5????????}

?6????????if(ip?==?null?||?ip.length()?==??||?"unknown".equalsIgnoreCase(ip))?{
?7????????????ip?=?request.getHeader("WL-Proxy-Client-IP"
);
?8????????}

?9????????if(ip?==?null?||?ip.length()?==??||?"unknown".equalsIgnoreCase(ip))?{
10????????????ip?=
?request.getRemoteAddr();
11????????}

12????????return?ip;
13????}

如果通過了多級反向代理的話,X-Forwarded-For的值并不止一個,而是一串Ip值,究竟哪個才是真正的用戶端的真實IP呢?

答案是取X-Forwarded-For中第一個非unknown的有效IP字符串。

如:
X-Forwarded-For:192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100
用戶真實IP為: 192.168.1.110

轉載于:https://my.oschina.net/u/140722/blog/26319

總結

以上是生活随笔為你收集整理的apache代理时java获取IP的问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。