隨筆-2  評論-0  文章-20  trackbacks-0

          在JSP里,獲取客戶端的IP地址的方法是:request.getRemoteAddr(),這種方法在大部分情況下都是有效的。

          但是在通過了 Apache,Squid等反向代理軟件就不能獲取到客戶端的真實IP地址了。如果使用了反向代理軟件,用 request.getRemoteAddr()方法獲取的IP地址是:127.0.0.1或 192.168.1.110,而并不是客戶端的真實IP。
          經過代理以后,由于在客戶端和服務之間增加了中間層,因此服務器無法直接拿到客戶端的 IP,服務器端應用也無法直接通過轉發請求的地址返回給客戶端。但是在轉發請求的HTTP頭信息中,增加了X-FORWARDED-FOR信息。用以跟蹤原有的客戶端IP地址和原來客戶端請求的服務器地址。當我們訪問index.jsp/時,其實并不是我們瀏覽器真正訪問到了服務器上的index.jsp 文件,而是先由代理服務器去訪問index.jsp ,代理服務器再將訪問到的結果返回給我們的瀏覽器,因為是代理服務器去訪問index.jsp的,所以index.jsp中通過 request.getRemoteAddr()的方法獲取的IP實際上是代理服務器的地址,并不是客戶端的IP地址。
          于是可得出獲得客戶端真實IP地址的方法一:


          public String getRemortIP(HttpServletRequest request) 
          if (request.getHeader("x-forwarded-for"== null
          return request.getRemoteAddr(); 
          }
           
          return request.getHeader("x-forwarded-for"); 
          }
           

           

          獲得客戶端真實IP地址的方法二:

          public String getIpAddr(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(); 
          }
           
          return ip; 
          }
           

          可是,如果通過了多級反向代理的話,X-Forwarded-For的值并不止一個,而是一串IP值,究竟哪個才是真正的用戶端的真實IP呢?
          答案是取X-Forwarded-For中第一個非unknown的有效IP字符串。如:
          X-Forwarded-For:192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100
          用戶真實IP為: 192.168.1.110
          posted on 2011-07-26 23:44 soken 閱讀(132) 評論(0)  編輯  收藏
          主站蜘蛛池模板: 延津县| 南投市| 南宫市| 稻城县| 富顺县| 团风县| 台北市| 泸水县| 黄浦区| 山阳县| 彭水| 樟树市| 武夷山市| 遵义县| 泽库县| 疏勒县| 固阳县| 贺兰县| 册亨县| 广水市| 德江县| 彭泽县| 金湖县| 巴林右旗| 永定县| 额敏县| 荥经县| 金坛市| 镇安县| 乌审旗| 青川县| 桦川县| 绥宁县| 徐水县| 龙南县| 邵阳市| 衡南县| 桐梓县| 延边| 泽库县| 高雄县|