2016-07-06 75 views
0

我试图从别人向我的REST接口(我使用jax-rs)发送POST请求时从HttpServletRequest获取IP。下面是我使用来获取IP的方法(在这里StackOverflow上一个问题中找到):尝试从HttpServletRequest获取IP时出现意外的结果

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; 
} 

发出请求(在这种情况下,从邮递员),当接收到的结果是这样的字符串:fe80:0:0:0:89a0:94d3:58a:a4e3%24。对我来说这是意想不到的。我需要了解如何获得一个合适的IP。

从评论中了解到,我得到的是ipv6地址,我需要的是ipv4地址。

回答

1

这看起来像是一个IPV6地址,最后是$。我不知道你从这个功能的哪个部分。

传统的IPV4地址是其中的一部分。该功能的不同部分可能会返回不同版本的IP。我不知道,但我会在其中添加一些痕迹来了解正在发生的事情。如果你不知道从哪里传来的信息,你可能会产生一些困惑。

的GetRemoteAddress功能是直接连接到该servlet的IP地址,但是,当然,它可能已通过代理等了

真的取决于您正在使用的IP地址是什么。我认为即使将来的某种方式不合时宜,将IPV6功能构建到系统中也是值得的。

+0

我检查了它,它来自request.getRemoteAddr()。 – user16655

+0

这有一个有趣的方式,可以给予IPV4地址或IPV6地址,具体取决于DNS中用于访问服务器的域的条目。然而,我仍然对美元符号感到困惑。恰巧我几天前在tomcat上使用了相同的功能,最后我没有收到美元。 –

+0

有人在这里写了一个很好的答案:http://stackoverflow.com/questions/3118829/why-request-getremoteaddr-returns-ipv4-or-ipv6-depending-on-context-post-quer –