Java HttpServletRequest getHeader何时返回未知?

Java HttpServletRequest getHeader何时返回未知?,java,spring-boot,proxy,http-headers,clientip,Java,Spring Boot,Proxy,Http Headers,Clientip,我正在使用下面的代码(从另一篇文章中复制)获取客户端IP地址以及代理服务器(部署在PCF中的SpringBoot Appln) 请求。getHeader(“X-Forwarded-For”)/request.getRemoteAddr();(从本地运行时)给出预期结果。我真的不明白其他条件的用途 在所有情况下,我都看到“未知”。使用equalsIgnoreCase(IP)。但当我试图访问request.getHeader(“代理客户端IP”)或任何垃圾字符串时,我得到的是null。 HttpSe

我正在使用下面的代码(从另一篇文章中复制)获取客户端IP地址以及代理服务器(部署在PCF中的SpringBoot Appln)

请求。getHeader(“X-Forwarded-For”)/request.getRemoteAddr();(从本地运行时)给出预期结果。我真的不明白其他条件的用途

  • 在所有情况下,我都看到“未知”。使用equalsIgnoreCase(IP)。但当我试图访问request.getHeader(“代理客户端IP”)或任何垃圾字符串时,我得到的是null。 HttpServletRequest getHeader何时返回未知?这可以忽略吗
  • 代理客户端IP/HTTP_客户端IP的用途是什么。我猜它是用来单独获取客户端IP(没有代理服务器IP)。它是特定于特定服务器的吗?如果是,请选择哪个服务器。 在Spring引导应用程序中可以忽略这一点吗
  • 我猜“WL代理客户端IP”是WebLogic特有的。这也可以被忽略吗
  • 我相信HTTP_u前缀是特定于PHP的(HTTP_X_FORWARDED_FOR和HTTP_CLIENT_IP)。在SpringBoot应用程序中有必要吗
  • 我觉得下面的代码足以获得客户端IP地址和代理服务器(前提是我使用带嵌入式tomcat的spring boot并在PCF中部署代码)。你能确认一下吗

    private static String getClientIpAddr(HttpServletRequest httpRequest)
    {
      String clientIp = httpRequest.getHeader("X-Forwarded-For");
    
      if (clientIp == null || clientIp.length() == 0)
      {
        clientIp = httpRequest.getRemoteAddr();
      }
      return clientIp;
    }
    

  • 你可能想要这样的东西

    public class HttpRequestHelper {
    
        private static final String[] HEADERS= {"X-Forwarded-For", "Proxy-Client-IP", "WL-Proxy-Client-IP", "HTTP_CLIENT_IP", "HTTP_X_FORWARDED_FOR"};
    
        public static String getClientIpAddr(HttpServletRequest request) {
            for (String header : HEADERS) {
                String ip = request.getHeader(header);
                if (ip != null && ip.length() > 0) {                    
                    return StringUtils.commaDelimitedListToStringArray(ip)[0];
                }
            }
            return request.getRemoteAddr();
        }    
    }
    
    这将尝试所有标题(按给定顺序),如果存在,则返回该标题。否则它将回退到
    请求。getRemoteAddr()
    。用更少的
    if
    语句实现同样的效果


    我还考虑了
    X-Forwarded-for
    头中可能存在多个ip地址的情况。它将始终返回解析数组中的第一个元素。

    那么,您的操作方式有什么问题?对于您的建议,这似乎是一个更为稳健的解决方案。我快速地看了一下,如果设置了
    X-Forwarded-For
    ,那么结果将是相同的。Sonaqube抱怨说,这种方法的圈复杂度大于授权。我可以用其他方法解决这个问题,但我只是不想有垃圾代码。此外,它还影响覆盖范围。我只是想在删除未使用的代码之前确认一下。我想“WL代理客户端IP”是WebLogic特有的。这也可以忽略吗?这是您的环境,所以您应该知道better@ThiagarajanRamanathan,也请看创建一个要检查的标题名列表,遍历它们,当返回时使用它。
    if
    语句中的内容总是相同的。您可能还需要将
    ip
    转换为
    字符串[]
    。当涉及多个路由器时,
    X-Forwarded-For
    可能会成为多个IP的逗号分隔列表。第一个是你想要的IP地址。谢谢你的回答。但我更感兴趣的是理解“未知”、“代理客户端IP”、“WL代理客户端IP”、“HTTP_客户端IP”、“HTTP_X_转发_FOR”的用法。有必要吗?如果spring引导代码部署在PCF中并通过Apigee代理访问,它会增加任何价值吗?我相信这些可能不会增加任何价值,因为它们是WebLogic和PHP特有的。因此,除非你打算使用它们,否则它们不会添加任何内容。
    unknown
    的原因我不知道,你应该问你使用代码的人:)。
    public class HttpRequestHelper {
    
        private static final String[] HEADERS= {"X-Forwarded-For", "Proxy-Client-IP", "WL-Proxy-Client-IP", "HTTP_CLIENT_IP", "HTTP_X_FORWARDED_FOR"};
    
        public static String getClientIpAddr(HttpServletRequest request) {
            for (String header : HEADERS) {
                String ip = request.getHeader(header);
                if (ip != null && ip.length() > 0) {                    
                    return StringUtils.commaDelimitedListToStringArray(ip)[0];
                }
            }
            return request.getRemoteAddr();
        }    
    }