成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

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

felix0913 / 2934人閱讀

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

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

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

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

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

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

偽代碼:

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

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

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

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

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

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

先說說這些請求頭的意思

X-Forwarded-For

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

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

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

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

HTTP_CLIENT_IP

有些代理服務(wù)器會加上此請求頭。

X-Real-IP

nginx代理一般會加上此請求頭。

下面是一個參考獲取客戶端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方法,但這個是經(jīng)過多級代理的IP地址,需要自己處理下獲取第一個。

有幾點要注意

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

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

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

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

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

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

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

如果對你有用,歡迎分享到朋友圈

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

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/71372.html

相關(guān)文章

  • Java后端

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

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

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

    LiuRhoRamen 評論0 收藏0
  • web后臺 - 收藏集 - 掘金

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

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

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

    Anchorer 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<