世界因你而精彩  
          日歷
          <2008年11月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          30123456
          統計
          • 隨筆 - 169
          • 文章 - 1
          • 評論 - 138
          • 引用 - 0

          導航

          常用鏈接

          留言簿(9)

          隨筆分類(163)

          隨筆檔案(154)

          文章檔案(1)

          新聞檔案(1)

          相冊

          收藏夾(1)

          個人雜雜

          友情鏈接

          自學考試

          資料搜索

          最新隨筆

          搜索

          •  

          積分與排名

          • 積分 - 359377
          • 排名 - 153

          最新評論

          閱讀排行榜

          評論排行榜

           
          在JSP里,獲取客戶端的IP地址的方法是:request.getRemoteAddr(),這種方法在大部分情況下都是有效的。但是在通過了Apache,Squid等反向代理軟件就不能獲取到客戶端的真實IP地址了。
          如果使用了反向代理軟件,將http://192.168.1.110:2046/ 的URL反向代理為http://www.xxx.com/ 的URL時,用request.getRemoteAddr()方法獲取的IP地址是:127.0.0.1 或 192.168.1.110,而并不是客戶端的真實IP。
          經過代理以后,由于在客戶端和服務之間增加了中間層,因此服務器無法直接拿到客戶端的IP,服務器端應用也無法直接通過轉發請求的地址返回給客戶端。但是在轉發請求的HTTP頭信息中,增加了X-FORWARDED-FOR信息。用以跟蹤原有的客戶端IP地址和原來客戶端請求的服務器地址。當我們訪問http://www.xxx.com/index.jsp/ 時,其實并不是我們瀏覽器真正訪問到了服務器上的index.jsp文件,而是先由代理服務器去訪問http://192.168.1.110:2046/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");

           }

          可是當我訪問http://www.xxx.com/index.jsp/ 時,返回的IP地址始終是unknown,也并不是如上所示的127.0.0.1 或 192.168.1.110了,而我訪問http://192.168.1.110:2046/index.jsp 時,則能返回客戶端的真實IP地址,寫了個方法去驗證。原因出在了Squid上。squid.conf 的配制文件 forwarded_for 項默認是為on,如果 forwarded_for 設成了 off  則:X-Forwarded-For: unknown

          于是可得出獲得客戶端真實IP地址的方法二:

           1    public String getIpAddr(HttpServletRequest request) {
           2        String ip = request.getHeader("x-forwarded-for");
           3        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
           4            ip = request.getHeader("Proxy-Client-IP");
           5        }

           6        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
           7            ip = request.getHeader("WL-Proxy-Client-IP");
           8        }

           9        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
          10            ip = request.getRemoteAddr();
          11        }

          12        return ip;
          13    }

            可是,如果通過了多級反向代理的話,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


          說明:按這種方法不一定100%準,網上很多人提到要準確的話必須做一個客戶端空間,如applet。
          posted on 2008-11-26 16:07 張秀蘭 閱讀(4141) 評論(1)  編輯  收藏 所屬分類: 資料查找
          評論:
          • # re: 轉:Java獲取IP地址:request.getRemoteAddr()警惕  333 Posted @ 2009-10-28 16:21
            這個種方法獲取不用windows vista的ip  回復  更多評論   

           
          Copyright © 張秀蘭 Powered by: 博客園 模板提供:滬江博客
          主站蜘蛛池模板: 饶平县| 洪泽县| 金川县| 安徽省| 汶川县| 本溪| 无极县| 古交市| 太保市| 万源市| 麟游县| 西青区| 东莞市| 十堰市| 乌兰浩特市| 那坡县| 孟村| 开封市| 玛沁县| 什邡市| 玉田县| 建宁县| 旬阳县| 黔东| 金华市| 永丰县| 淮阳县| 个旧市| 宁城县| 霍山县| 虹口区| 樟树市| 伊金霍洛旗| 万安县| 霍林郭勒市| 平顶山市| 阳谷县| 武川县| 德钦县| 金门县| 山丹县|