成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Java中如何獲取客戶端真實(shí)IP地址

本篇文章給大家分享的是有關(guān)Java中如何獲取客戶端真實(shí)IP地址,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

成都創(chuàng)新互聯(lián)公司主營武川網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,app軟件開發(fā)公司,武川h5小程序開發(fā)搭建,武川網(wǎng)站營銷推廣歡迎武川等地區(qū)企業(yè)咨詢

業(yè)務(wù)背景

服務(wù)器端接收客戶端請求的時候,一般需要進(jìn)行簽名驗(yàn)證,客戶端IP限定等攔截,在進(jìn)行IP限定的時候就需要獲取客戶端真實(shí)的IP。

基礎(chǔ)知識

訪問服務(wù)端的方式一般分為兩種:

未經(jīng)過代理,直接訪問服務(wù)器端;

通過多級代理,最終到達(dá)服務(wù)器端(nginx,squid,haproxy)。

客戶端請求信息都包含在HttpServletRequest中,對于第一種訪問方式可以通過getRemoteAddr()方法獲得客戶端真實(shí)IP,而另一種則行不通,但是可以通過x-forwarded-for獲得轉(zhuǎn)發(fā)后請求信息。當(dāng)客戶端請求被轉(zhuǎn)發(fā)時,IP將會追加在其后并以英文逗號隔開,例如:10.47.103.13,4.2.2.2,10.96.112.230。

請求中的參數(shù):

request.getHeader("x-forwarded-for") : 10.47.103.13,4.2.2.2,10.96.112.230  request.getHeader("X-Real-IP") : 10.47.103.13  request.getRemoteAddr():10.96.112.230

客戶端訪問經(jīng)過轉(zhuǎn)發(fā),IP將會追加在其后并以逗號隔開。最終準(zhǔn)確的客戶端信息為:

x-forwarded-for 不為空,則為逗號前第一個IP ;  X-Real-IP不為空,則為該IP ;  否則為getRemoteAddr() ;

相關(guān)請求頭的解釋:

X-Forwarded-For 記錄一個請求從客戶端出發(fā)到目標(biāo)服務(wù)器過程中經(jīng)歷的代理,或者負(fù)載平衡設(shè)備的IP。這是由緩存代理軟件 Squid 引入,用來表示 HTTP 請求端真實(shí) IP,現(xiàn)在已經(jīng)成為事實(shí)上的標(biāo)準(zhǔn),被各大 HTTP 代理、負(fù)載均衡等轉(zhuǎn)發(fā)服務(wù)廣泛使用,并被寫入 RFC 7239(Forwarded HTTP Extension)標(biāo)準(zhǔn)之中。格式為X-Forwarded-For:client1,proxy1,proxy2,一般情況下,第一個ip為客戶端真實(shí)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代理一般會加上此請求頭。

獲取客戶端真實(shí)IP地址

源碼:

/** * 獲取客戶端的IP地址<br/> * 注意本地測試訪問項(xiàng)目地址時,瀏覽器請求不要用 localhost,請用本機(jī)IP;否則,取不到 IP * * @author east7 * @date 2019年12月03日 * @return String 真實(shí)IP地址 */public static String getClientIpAddress(HttpServletRequest request) {  // 獲取請求主機(jī)IP地址,如果通過代理進(jìn)來,則透過防火墻獲取真實(shí)IP地址  String headerName = "x-forwarded-for";  String ip = request.getHeader(headerName);  if (null != ip && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {    // 多次反向代理后會有多個IP值,第一個IP才是真實(shí)IP,它們按照英文逗號','分割    if (ip.indexOf(",") != -1) {      ip = ip.split(",")[0];    }  }  if (checkIp(ip)) {    headerName = "Proxy-Client-IP";    ip = request.getHeader(headerName);  }  if (checkIp(ip)) {    headerName = "WL-Proxy-Client-IP";    ip = request.getHeader(headerName);  }  if (checkIp(ip)) {    headerName = "HTTP_CLIENT_IP";    ip = request.getHeader(headerName);  }  if (checkIp(ip)) {    headerName = "HTTP_X_FORWARDED_FOR";    ip = request.getHeader(headerName);  }  if (checkIp(ip)) {    headerName = "X-Real-IP";    ip = request.getHeader(headerName);  }  if (checkIp(ip)) {    headerName = "remote addr";    ip = request.getRemoteAddr();    // 127.0.0.1 ipv4, 0:0:0:0:0:0:0:1 ipv6    if ("127.0.0.1".equals(ip) || "0:0:0:0:0:0:0:1".equals(ip)) {      //根據(jù)網(wǎng)卡取本機(jī)配置的IP      InetAddress inet = null;      try {        inet = InetAddress.getLocalHost();      } catch (UnknownHostException e) {        e.printStackTrace();      }      ip = inet.getHostAddress();    }  }  logger.info("getClientIp IP is " + ip + ", headerName = " + headerName);  return ip;}private static boolean checkIp(String ip) {  if (null == ip || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {    return true;  }  return false;}

以上就是Java中如何獲取客戶端真實(shí)IP地址,小編相信有部分知識點(diǎn)可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

分享題目:Java中如何獲取客戶端真實(shí)IP地址
瀏覽地址:http://jinyejixie.com/article32/pgispc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設(shè)、商城網(wǎng)站、小程序開發(fā)軟件開發(fā)、定制開發(fā)域名注冊

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)
潞城市| 巢湖市| 旅游| 剑河县| 镇远县| 托克逊县| 韶关市| 施秉县| 通州市| 金华市| 通州市| 乐山市| 扶绥县| 安庆市| 喀喇沁旗| 久治县| 济宁市| 南华县| 松潘县| 辽中县| 汝阳县| 遂溪县| 桃园市| 北安市| 北票市| 余姚市| 泗洪县| 高安市| 乌拉特后旗| 东光县| 阿克苏市| 靖江市| 辽宁省| 阿图什市| 安多县| 大冶市| 虹口区| 永平县| 高要市| 清苑县| 赤水市|