2016-07-06 76 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 –