尝试从 HttpServletRequest 获取 ip 时出现意外结果
Unexpected result when trying to get ip from HttpServletRequest
当有人向我的 REST 接口(我使用的是 jax-rs)发出 POST 请求时,我试图从 HttpServletRequest 获取 IP。这是我用来获取 IP 的方法(在 Whosebug 上的另一个问题中找到):
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;
}
发出请求(在本例中来自 PostMan)时收到的结果是这个字符串:fe80:0:0:0:89a0:94d3:58a:a4e3%24
。对我来说,这是出乎意料的。我需要了解如何获得适当的 IP。
从评论中了解到,我得到的是 ipv6 地址,我需要的是 ipv4 地址。
这看起来像是一个末尾带有 $ 的 IPV6 地址。我不知道你是从函数的哪一部分得到的。
传统的 IPV4 地址是其中的一部分。函数的不同部分可能会返回不同版本的 IP。我不知道,但我会在其中添加一些痕迹以找出正在发生的事情。如果您不知道什么来自哪里,您可能会感到很困惑。
GetRemoteAddress 函数是直接连接到 servlet 的 IP 地址,但是,当然,它可以通过代理等。
具体取决于您使用 IP 地址的目的。我认为值得将 IPV6 功能构建到系统中以进行未来验证,即使未来还有一段路要走。
当有人向我的 REST 接口(我使用的是 jax-rs)发出 POST 请求时,我试图从 HttpServletRequest 获取 IP。这是我用来获取 IP 的方法(在 Whosebug 上的另一个问题中找到):
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;
}
发出请求(在本例中来自 PostMan)时收到的结果是这个字符串:fe80:0:0:0:89a0:94d3:58a:a4e3%24
。对我来说,这是出乎意料的。我需要了解如何获得适当的 IP。
从评论中了解到,我得到的是 ipv6 地址,我需要的是 ipv4 地址。
这看起来像是一个末尾带有 $ 的 IPV6 地址。我不知道你是从函数的哪一部分得到的。
传统的 IPV4 地址是其中的一部分。函数的不同部分可能会返回不同版本的 IP。我不知道,但我会在其中添加一些痕迹以找出正在发生的事情。如果您不知道什么来自哪里,您可能会感到很困惑。
GetRemoteAddress 函数是直接连接到 servlet 的 IP 地址,但是,当然,它可以通过代理等。
具体取决于您使用 IP 地址的目的。我认为值得将 IPV6 功能构建到系统中以进行未来验证,即使未来还有一段路要走。