【发布时间】:2018-08-13 23:52:57
【问题描述】:
我正在使用以下代码(从另一篇帖子复制 - How do I get the remote address of a client in servlet?)获取客户端 IP 地址以及代理服务器(部署在 PCF 中的 SpringBoot Appln)。
public static String getClientIpAddr(HttpServletRequest request)
{
String ip = request.getHeader("X-Forwarded-For");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
{
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
{
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
{
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
{
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
{
ip = request.getRemoteAddr();
}
return ip;
}
request.getHeader("X-Forwarded-For"); /request.getRemoteAddr(); (从本地运行时)给出预期的结果。实在不明白其他条件的用途。
- 在所有情况下,我都看到“未知”。equalsIgnoreCase(IP) 被使用。但是当我尝试访问 request.getHeader("Proxy-Client-IP") 或任何垃圾字符串时,我得到了空值。 当 HttpServletRequest getHeader 返回未知?这可以忽略吗?
- Proxy-Client-IP/HTTP_CLIENT_IP 有什么用。我猜它是用来单独获取客户端IP(没有代理服务器IP)的。它是特定于特定服务器的吗?如果是的话,哪个服务器。 这可以在 Spring Boot 应用程序中忽略吗
- 我猜“WL-Proxy-Client-IP”是 WebLogic 特有的。这也可以忽略吗?
- 我认为 HTTP_ 前缀是 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; }
【问题讨论】:
-
那么你的做法有什么问题呢?对于您的提议方式和我的快速浏览,这似乎是一个更强大的解决方案,如果设置了
X-Forwarded-For,那么结果将是相同的。 -
Sonaqube 抱怨这种方法的圈复杂度大于授权。我可以通过其他方式解决这个问题,但我只是不想有垃圾未使用的代码。此外,它会影响覆盖范围。我只是想确保在删除未使用的代码之前。
-
我猜 'WL-Proxy-Client-IP' 是特定于 WebLogic 的。这也可以忽略 - 这是你的环境,所以你应该更了解
-
@Thiagarajan Ramanathan,另请参阅stackoverflow.com/questions/18350318/…
-
只需创建一个标题名称列表来检查,遍历它们,当你回来时使用它。
if语句中的内容总是相同的。您可能想要做的一个补充是将ip转换为String[]。当涉及多个路由器时,X-Forwarded-For可能会成为多个 IP 的逗号分隔列表。其中第一个是你想要的IP。
标签: java spring-boot proxy http-headers clientip