Java HttpServletRequest getHeader何时返回未知?
我正在使用下面的代码(从另一篇文章中复制)获取客户端IP地址以及代理服务器(部署在PCF中的SpringBoot Appln) 请求。getHeader(“X-Forwarded-For”)/request.getRemoteAddr();(从本地运行时)给出预期结果。我真的不明白其他条件的用途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
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();
}
}