2

私のWebアプリケーションでは、プロキシの背後にあるクライアントの実際のIPアドレスを抽出する必要があります。検索した後、「X_FORWARDED_FOR」ヘッダーのコンテンツを読み取ることが可能な方法であることがわかりました。Javaサーブレットと着信ヘッダーのヘッダーを使用しています。リクエストに「X_FORWARDED_FOR」ヘッダーが含まれていないのに、なぜヘッダーがリクエストに含まれていないのでしょうか。

私はjava1.7、tomcat v7、プロキシサーバー:TMGを使用しており、「X_FORWARDED_FOR」ヘッダーを使用するように構成されています。

ご意見をお聞かせください。

前もって感謝します。

アップデート :

  • リクエストは、jqueryajaxリクエストからサーブレットに送信されます。
  • 利用可能なヘッダーを読み取るための私のコード:

    String ip = request.getHeader("X-Forwarded-For"); //nullを返します

            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
                ip = request.getHeader("Proxy-Client-IP");  //return null
            }  
            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
                ip = request.getHeader("WL-Proxy-Client-IP");  //return null
            }  
            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
                ip = request.getHeader("HTTP_CLIENT_IP");  //return null
            }  
            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
                ip = request.getHeader("HTTP_X_FORWARDED_FOR");  //return null
            }  
            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
                ip = request.getRemoteAddr();  //return proxy server IP
            }  
    
4

2 に答える 2

2

X-Forwarded-For、およびテストする他のヘッダーはカスタムです(ほぼ標準ですが、完全ではありません)。プロキシはそのようなヘッダーを設定する必要がないため、プロキシサーバーが設定するヘッダーがある場合はそれをテストする必要があります。

ただし、設定される場合は、次のコマンドでテストします。

request.getHeader("X-Forwarded-For");

HTTP_X_FORWARDED_FORはPHPの命名になりますが、PHPを使用していない場合は使用しないでください...

すべての着信ヘッダーを繰り返し、ヘッダーにIPが含まれているかどうかを確認します。それらのどれもしない場合、あなたは運が悪いです。

すべてのヘッダーを次のように繰り返すことができます

enames = request.getHeaderNames();
while (enames.hasMoreElements()) {
  String name = (String) enames.nextElement();
  String value = request.getHeader(name);
  // "name" and "value" variables contain the header + its value
}

また、Javaアプリの場合、サーブレットに渡されるのは内部リクエストであることが多く、ヘッダーを持つhttpservletrequestのインスタンスを取得するには、最初に外部リクエストを要求する必要があることに注意してください。

また、そのヘッダーから実際にIPを取得したとしても、それが有用な情報であるかどうかを検討する必要があることにも注意してください。ここでそれについてのいくつかの詳細。

于 2012-12-09T15:38:33.677 に答える
1

これはうまくいくかもしれません:

 public static String X_FORWARDED_FOR_HEADER = "X-Forwarded-For";

 public static boolean isNullOrEmpty(String val) 
  {
    if (val == null || val.length() == 0) 
    {
      return true;
    }
    return false;
  } 

 public static String getRemoteAddress(HttpServletRequest request) {
  String remoteAddr = request.getHeader(X_FORWARDED_FOR_HEADER);
  if (!isNullOrEmpty(remoteAddr)) {
      int pos = remoteAddr.indexOf(',');
      if (pos < 0) {
          return remoteAddr;
      }
      return remoteAddr.substring(0,pos); // if more then 1, take first one 
  }
  return request.getRemoteAddr();
  }
于 2014-01-31T14:37:20.583 に答える