我正在使用以下代码(从另一篇文章复制 -如何在 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; }