51

クライアントを取得する必要があるJSPサーブレット(コンテナー: Glassfish )を使用して Web アプリケーションを開発していますIP Address

クライアントの IP アドレスを取得しています。一部のページ (顧客保守フォームなど) へのアクセスをオフィス内のコンピューターのみに許可したいので、オフィス外のページへのアクセスを制限したいからです。

これまでの私のコードは次のとおりです。

方法1

String ipAddress =  request.getRemoteAddr();
System.out.println("IP Address: "+ipAddress);

方法2

String ipAddress=null;
String getWay = request.getHeader("VIA");   // Gateway
ipAddress = request.getHeader("X-FORWARDED-FOR");   // proxy
if(ipAddress==null)
{
    ipAddress = request.getRemoteAddr();
}
System.out.println("IP Address: "+ipAddress);

上記のコードはdifferent IP Address、コンピューターを再起動するたびに表示されます (シャットダウン -> 開始または再起動)。

私はIP6次のようになっています:

fe80:0:0:0:20ca:1776:f5ff:ff15%13

このコードの何が問題なのか教えてください。

4

5 に答える 5

35

次の静的ヘルパー メソッドを使用して、クライアントの IP を取得します。

public static String getClientIpAddr(HttpServletRequest request) {  
    String ip = request.getHeader("X-Forwarded-For");  
    if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) {  
        ip = request.getHeader("Proxy-Client-IP");  
    }  
    if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) {  
        ip = request.getHeader("WL-Proxy-Client-IP");  
    }  
    if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) {  
        ip = request.getHeader("HTTP_X_FORWARDED_FOR");  
    }  
    if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) {  
        ip = request.getHeader("HTTP_X_FORWARDED");  
    }  
    if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) {  
        ip = request.getHeader("HTTP_X_CLUSTER_CLIENT_IP");  
    }  
    if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) {  
        ip = request.getHeader("HTTP_CLIENT_IP");  
    }  
    if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) {  
        ip = request.getHeader("HTTP_FORWARDED_FOR");  
    }  
    if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) {  
        ip = request.getHeader("HTTP_FORWARDED");  
    }  
    if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) {  
        ip = request.getHeader("HTTP_VIA");  
    }  
    if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) {  
        ip = request.getHeader("REMOTE_ADDR");  
    }  
    if (ip == null || ip.length() == 0 || ip.equalsIgnoreCase("unknown")) {  
        ip = request.getRemoteAddr();  
    }  
    return ip;  
}
于 2014-02-03T14:32:03.867 に答える
1

ネットワークの構成方法に関係があると思います。サーブレットは、見つけたアドレスを提供しているだけです。

2 つの回避策を提案できます。まず、IPV4 を使用してみます。このSO回答を参照してください

また、request.getRemoteHost() メソッドを使用してマシンの名前を取得してみてください。確かに、名前はマッピング先の IP に依存しません。

これについては、インフラ担当者と話し合う必要があると思います。

于 2013-05-15T14:41:38.610 に答える