2

在我的Web应用程序中,我需要为代理后面的客户端提取真实IP地址,经过搜索我发现可能的方法是读取“X_FORWARDED_FOR”标头的内容,我正在使用java servlet和传入的标头请求不包含“X_FORWARDED_FOR”标头,那么为什么标头不包含在请求中?

我正在使用 java 1.7、tomcat v7、代理服务器:TMG 并配置为使用“X_FORWARDED_FOR”标头。

请指教。

提前致谢。

更新 :

  • 该请求来自对 servlet 的 jquery ajax 请求。
  • 我读取可用标题的代码:

    String ip = request.getHeader("X-Forwarded-For"); //返回空

            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 应用程序,传递给 servlet 的通常是内部请求,您需要首先请求外部请求以获取具有标头的 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 回答