欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java獲取客戶端真實IP地址過程解析

 更新時間:2020年01月16日 11:04:42   作者:樓蘭的胡楊  
這篇文章主要介紹了Java獲取客戶端真實IP地址過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

這篇文章主要介紹了Java獲取客戶端真實IP地址過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

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

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

基礎(chǔ)知識

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

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

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

客戶端請求信息都包含在HttpServletRequest中,對于第一種訪問方式可以通過getRemoteAddr()方法獲得客戶端真實IP,而另一種則行不通,但是可以通過x-forwarded-for獲得轉(zhuǎn)發(fā)后請求信息。當客戶端請求被轉(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將會追加在其后并以逗號隔開。最終準確的客戶端信息為:

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

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

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

源碼:

/**
 * 獲取客戶端的IP地址<br/>
 * 注意本地測試訪問項目地址時,瀏覽器請求不要用 localhost,請用本機IP;否則,取不到 IP
 *
 * @author east7
 * @date 2019年12月03日
 * @return String 真實IP地址
 */
public static String getClientIpAddress(HttpServletRequest request) {
  // 獲取請求主機IP地址,如果通過代理進來,則透過防火墻獲取真實IP地址
  String headerName = "x-forwarded-for";
  String ip = request.getHeader(headerName);
  if (null != ip && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {
    // 多次反向代理后會有多個IP值,第一個IP才是真實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)卡取本機配置的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;
}

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • MyBatis-Plus中最簡單的查詢操作教程(Lambda)

    MyBatis-Plus中最簡單的查詢操作教程(Lambda)

    這篇文章主要給大家介紹了關(guān)于MyBatis-Plus中最簡單的查詢操作的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2022-03-03
  • Idea自動生成Entity實現(xiàn)過程詳解

    Idea自動生成Entity實現(xiàn)過程詳解

    這篇文章主要介紹了Idea自動生成Entity實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • SpringBoot+Maven 多模塊項目的構(gòu)建、運行、打包實戰(zhàn)

    SpringBoot+Maven 多模塊項目的構(gòu)建、運行、打包實戰(zhàn)

    這篇文章主要介紹了SpringBoot+Maven 多模塊項目的構(gòu)建、運行、打包實戰(zhàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • GSON框架下將百度天氣JSON數(shù)據(jù)轉(zhuǎn)JavaBean

    GSON框架下將百度天氣JSON數(shù)據(jù)轉(zhuǎn)JavaBean

    這篇文章主要為大家詳細介紹了如何在GSON框架下實現(xiàn)將百度天氣JSON數(shù)據(jù)轉(zhuǎn)JavaBean,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下
    2025-08-08
  • 解決MyBatis報錯:There is no getter for property named'Xxx'in'class xxx.xxx.Xxx'

    解決MyBatis報錯:There is no getter for 

    這篇文章主要介紹了解決MyBatis報錯:There is no getter for property named'Xxx'in'class xxx.xxx.Xxx'問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java中的接口及其應(yīng)用場景解讀

    Java中的接口及其應(yīng)用場景解讀

    這篇文章主要介紹了Java中的接口及其應(yīng)用場景解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 詳解Java中運算符及用法

    詳解Java中運算符及用法

    這篇文章主要介紹了詳解Java中運算符以及相關(guān)的用法講解,一起跟著小編學習下吧。
    2017-12-12
  • Java連接服務(wù)器的兩種方式SFTP和FTP

    Java連接服務(wù)器的兩種方式SFTP和FTP

    在項目開發(fā)中,一般文件存儲很少再使用SFTP服務(wù),但是也不排除合作伙伴使用SFTP來存儲項目中的文件或者通過SFTP來實現(xiàn)文件數(shù)據(jù)的交互,這篇文章主要介紹了Java集成FTP與SFTP連接池
    2023-02-02
  • 基于java中的null類型---有關(guān)null的9件事

    基于java中的null類型---有關(guān)null的9件事

    這篇文章主要介紹了java中的null類型---有關(guān)null的9件事,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Spring Boot2與Spring Boot3的區(qū)別小結(jié)

    Spring Boot2與Spring Boot3的區(qū)別小結(jié)

    SpringBoot2和SpringBoot3之間有一些重要的區(qū)別,本文就來探討SpringBoot2和SpringBoot3之間的區(qū)別,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10

最新評論