web服務器獲取請求客戶端真實地址的方法


服務器獲取客戶端或者網頁的請求,獲取IP時需要注意, 因為一個請求到達服務器之前,一般都會經過一層或者多層代理服務器,比如反向代理服務器將http://192.168.1.10:port/ 的URL反向代理為http://www.xxx.com/ 的URL時,用request.getRemoteAddr() 方法獲取的IP地址是:127.0.0.1 或 192.168.1.10 ,而並不是客戶端的真實IP。但在經過代理服務器之后,請求頭中都會多一些字段,我們可以根據這些字段來獲取真實的IP而不是經過代理服務器生成的IP。

    String ip = request.getHeader("X-Forwarded-For");
    if (StringUtils.isNotEmpty(ip) && !"unKnow".equalsIgnoreCase(ip)) {
        //多次反向代理后會有多個ip值,第一個ip才是真實ip
        String[] ipList = ip.split(",");
        ip = ipList[0];
     } else {
        ip = request.getHeader("X-Real-IP");
        if (StringUtils.isEmpty(ip) || "unKnown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
     }

REMOTE_ADDR
表示發出請求的遠程主機的 IP 地址,remote_addr代表客戶端的IP,但它的值不是由客戶端提供的,而是服務端根據客戶端的ip指定的,當你的瀏覽器訪問某個網站時,假設中間沒有任何代理,那么網站的web服務器(Nginx,Apache等)就會把remote_addr設為你的機器IP,如果你用了某個代理,那么你的瀏覽器會先訪問這個代理,然后再由這個代理轉發到網站,這樣web服務器就會把remote_addr設為這台代理機器的IP
x_forwarded_for
簡稱XFF頭,它代表客戶端,也就是HTTP的請求端真實的IP,只有在通過了HTTP 代理或者負載均衡服務器時才會添加該項,正如上面所述,當你使用了代理時,web服務器就不知道你的真實IP了,為了避免這個情況,代理服務器通常會增加一個叫做x_forwarded_for的頭信息,把連接它的客戶端IP(即你的上網機器IP)加到這個頭信息里,這樣就能保證網站的web服務器能獲取到真實IP
格式一般為:
1
X-Forwarded-For: 1.1.1.1, 2.2.2.2, 3.3.3.3
代表 請求由1.1.1.1發出,經過三層代理,第一層是2.2.2.2,第二層是3.3.3.3,而本次請求的來源IP4.4.4.4是第三層代理
X-Real-IP
當有多個代理時候,可以在第一個反向代理上配置“proxy_set_header X-Real-IP $remote_addr”  這時候可以通過   X-Real-IP 獲取真實客戶端IP
-----------------------------------------
X-Forwarded-For一般是每一個非透明代理轉發請求時會將上游服務器的IP地址追加到X-Forwarded-For的后面,使用英文逗號分割
X-Real-IP一般是最后一級代理將上游IP地址添加到該頭中
X-Forwarded-For是多個IP地址,而X-Real-IP是一個,它里面具體值是代理服務器可配置的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM