1. 程式人生 > >java伺服器端獲取客戶端IP地址

java伺服器端獲取客戶端IP地址

在開發工作中,我們常常需要獲取客戶端的IP。一般獲取客戶端的IP地址的方法是:request.getRemoteAddr();但是在通過了Apache,Squid等反向代理軟體就不能獲取到客戶端的真實IP地址了。

原因:由於在客戶端和服務之間增加了中間代理,因此伺服器無法直接拿到客戶端的IP,伺服器端應用也無法直接通過轉發請求的地址返回給客戶端。

現在圖示代理上網和IP的關係:

 第一種情況:不通過代理上網,伺服器端拿到真實IP


 第二種情況:通過代理伺服器如:Nginx,Squid等一層代理或多層代理上網,如下圖:


需要注意的是X-Forwarded-For和X-Real-IP都不是http的正式協議頭,而是squid等反向代理軟體最早引入的,之所以resin能拿到,是因為NGINX裡一般預設都會這麼配置轉發的http請求:

location / {

         proxy_pass       http://yourdomain.com;

         proxy_set_header   Host             $host;

         proxy_set_header   X-Real-IP        $remote_addr;

         proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

         },從X-Forwarded-For的定義來看,ips[0]才是原始客戶端ip,如果這個都不是,那拿第二個就更不靠譜了,我們平時檢驗的時候,可能是直接在內網掛代理去訪問的,跟外面網友訪問經過的網路路徑不一樣,後面不停新增的是經過的每一層代理ip才對,下面舉例說明;

request.getRemoteAddr() 192.168.239.196

request.getHeader("X-Forwarded-For") 58.63.227.162, 192.168.237.178, 192.168.238.218

request.getHeader("X-Real-IP") 192.168.238.218

所以訪問的流程應該是這樣,客戶端58.63.227.162發出請求,經過192.168.237.178, 192.168.238.218兩層轉發,到了192.168.239.196這臺NGINX上,NGINX就把X-Real-IP頭設成了自己看到的remote_addr,也就是直接發給到他的192.168.238.218,這時候resin收到這個包,對resin來說直接發給他的remote_addr就是NGINX的ip,也就是192.168.239.196,那麼resin裡面的request.getRemoteAddr()就是192.168.239.196,那麼在resin裡拿最原始的ip邏輯(也就是拿能夠知道的最外層的ip)應該是這樣:

            如果XFF不為空,拿XFF的左邊第一個

            如果XFF為空,拿XRI

            如果XRI為空,只能拿request.getRemoteAddr(),也就是隻能拿到最直接發給他的機器ip了,

其他都不可考究,參考程式碼如下:

第一種程式碼:

      /**

      *Request物件中獲得客戶端IP,處理了HTTP代理伺服器和Nginx的反向代理截取了ip

      *@param request

      *@return ip

      */

    public static String getLocalIp(HttpServletRequest request) {

        String remoteAddr =request.getRemoteAddr();

        String forwarded =request.getHeader("X-Forwarded-For");

        String realIp =request.getHeader("X-Real-IP");

        String ip = null;

        if (realIp == null) {

            if (forwarded == null) {

                ip = remoteAddr;

            } else {

                ip = remoteAddr +"/" + forwarded.split(",")[0];

            }

        } else {

            if(realIp.equals(forwarded)) {

                ip = realIp;

            } else {

                if(forwarded != null){

                    forwarded =forwarded.split(",")[0];

                }

                ip = realIp +"/" + forwarded;

            }

        }

        return ip;

    }

第二種程式碼:

 1      public static String getIp(HttpServletRequest request) {

 2         String remoteAddr =request.getRemoteAddr();

 3         String forwarded =request.getHeader("X-Forwarded-For");

 4         String realIp =request.getHeader("X-Real-IP");

 5

 6         String ip =null;

 7        if (realIp == null) {

 8            if (forwarded == null) {

 9                 ip = remoteAddr;

10             }else {

11                 ip = remoteAddr +"/" + forwarded;

12             }

13         }else {

14             if (realIp.equals(forwarded)) {

15                 ip = realIp;

16             }else {

17                 ip = realIp +"/" + forwarded.replaceAll(", " + realIp, "");

18             }

19         }

20        return ip;

21     }

第三種程式碼:

 1       public  static String getIp2(HttpServletRequest request) {

 2            String ip =request.getHeader("X-Forwarded-For");

 3           if(StringUtils.isNotEmpty(ip)&& !"unKnown".equalsIgnoreCase(ip)){

 4               //多次反向代理後會有多個ip值,第一個ip才是真實ip

 5                int index =ip.indexOf(",");

 6               if(index != -1){

 7                   returnip.substring(0,index);

 8                }else{

 9                   return ip;

10                }

11            }

12            ip =request.getHeader("X-Real-IP");

13           if(StringUtils.isNotEmpty(ip)&& !"unKnown".equalsIgnoreCase(ip)){

14               return ip;

15            }

16           returnrequest.getRemoteAddr();

17        }

相關推薦

java伺服器獲取客戶IP地址

在開發工作中,我們常常需要獲取客戶端的IP。一般獲取客戶端的IP地址的方法是:request.getRemoteAddr();但是在通過了Apache,Squid等反向代理軟體就不能獲取到客戶端的真實IP地址了。 原因:由於在客戶端和服務之間增加了中間代理,因此伺服器無法直

客戶TCP時間獲取以及實現服務獲取客戶IP地址

這一次的問題主要是通過accept函式生成描述字,實現客戶端與伺服器的連線。 #include int accept(int sockfd, struct sockaddr *cliaddr, so

Java面試-如何獲取客戶真實IP

在進行一些小遊戲開發時,我們經常比較關注的一個功能便是分享。針對分享,我們希望能根據各個城市或者地區,能有不同的分享文案,辨識地區的功能如果由伺服器來完成的話,我們就需要知道客戶端的真實IP。今天我們就來看看伺服器是如何獲取到客戶端的真實IP的。 ## nginx配置 首先,一個請求肯定是可以分為請求頭

nginx代理,tomcat部署服務器,後獲取客戶真實ip

nginx代理 獲取真實ip 1、環境部署說明後端部署在tomcat服務器上,前端用nginx做代理訪問tomcat部署目錄nginx配置:upstream wcfront{ server localhost:8991;//後臺接口 } server { listen

服務獲取客戶ip方法

X-Forwarded-For X-Forwarded-For:簡稱XFF頭,它代表客戶端,也就是HTTP的請求端真實的IP,只有在通過了HTTP 代理或者負載均衡伺服器時才會新增該項。它不是RFC中定義的標準請求頭資訊,在squid快取代理伺服器開發文件中可以找到該項的詳細介紹。標準格式如下:

使用thrift實現了Java伺服器和nodejs客戶之間的跨平臺通訊

注意,我們要把exe和tar檔案都下載下來,exe用來編譯你的thrift中間語言,而tar解壓後,我們可以看到csharp,php,java,js等多種開發語言的例項程式碼,對我們很有幫助的,下載最新版,其中包含lib檔案庫,包含各種語言需要的類庫; 下載之後,我們把exe檔案可放在C盤,建個Thri

java web 專案 獲取客戶 域賬戶和計算機名

package com; import java.io.IOException; import java.net.InetAddress; import java.util.Enumeration; import javax.servlet.ServletException

Java獲取客戶所在的IP地址伺服器地址

/** 2 * 獲取本地IP地址 3 * @return 4 */ public static void main(String[] args) { 2

Java獲取客戶使用者真實IP地址

在JSP裡,獲取客戶端的IP地址的方法是:request.getRemoteAddr(),這種方法在大部分情況下都是有效的。但是在通過了Apache,Squid,nginx等反向代理軟體就不能獲取到客戶端的真實IP地址了。 如果使用了反向代理軟體,將http://192.168.1.110

獲取nginx客戶IP地址 Java request獲取客戶ip,各種apach,nginx等代理後依然正確

Java request獲取客戶端ip,各種apach,nginx等代理後依然正確 2017年02月22日 17:15:15 閱讀數:3268 在JSP,Java裡,獲取客戶端的IP地址的方法是:request.getRem

php獲取客戶ip地址或者伺服器ip地址

1.$_SERVER['REMOTE_ADDR'] 客戶端IP,有可能是使用者的IP,也可能是代理的IP。 2.$_SERVER['HTTP_CLIENT_IP'] 代理端的IP,可能存在可偽造。 3.$_SERVER['HTTP_X_FORWARDER_FOR'] 使用者是在哪個IP使用的代理,可

java獲取客戶ip地址

public static String getIp2(HttpServletRequest request) { String ip = request.getHeader("X-Forwarded-For"); if(StringUtils.isNotEmpty(ip) && !"unKn

java伺服器獲取客戶ip

在寫服務端程式碼時,有時需要對客戶端ip做認證,比如限制只有某些ip能訪問,或者1個ip1天只能訪問幾次。最近就碰到個需要限制ip的情況,從網上找了一些伺服器獲取客戶端ip的方法,說的都不太完善,這裡整理一下。 獲取客戶端ip其實就是從request中取,從header取或

java程式碼中得到本地ip地址獲取客戶請求IP(終端使用者的網際網路或內網IP地址

 private static String getLocalIP() throws Exception{    String localIP = "";    InetAddress addr = (InetAddress) InetAddress.getLocalHos

Java獲取客戶真實IP地址的兩種方法

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

java IP地址工具類,java IP地址獲取java獲取客戶IP地址

java IP地址工具類,java IP地址獲取,java獲取客戶端IP地址   ================================ ©Copyright 蕃薯耀 2019年1月11日 http://fanshuyao.iteye.com/   impo

java 後臺獲取客戶ip地址

// java 後臺獲取訪問客戶端ip地址 protected String getClientIpAddress(HttpServletRequest request) {

Java獲取客戶/訪問者真實IP地址的兩種方法

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

Java獲取客戶真實IP地址

1、我們一般在程式開發時,總會用到這種獲取訪問者IP的功能,以便記錄客戶端的登入和訪問行為。一般情況下,我們可以使用 request 的 getRemoteAddr() 方法獲取客戶端實際 IP ,但是 Nginx 使用反向代理後,我們使用 getRemo

Java獲取客戶及區域網ip和埠地址

在java專案Controller層加入下面程式碼: public Map<String,Object>selectAccessory(HttpServletRequest request){ //public Map<String,Object>