2015-09-07 162 views
1

我有一些代碼來確定Web請求是否已從本地計算機進行。它使用HttpServletRequest.getLocalAddr()並將結果與​​127.0.0.1進行比較。Java getLocalAddr()返回IPV6地址

但是,在最後一天,Chrome瀏覽器發出的請求失敗。地址現在是IPV6格式而不是IPV4,即0:0:0:0:0:0:0:1。如果使用IE而不是Chrome,地址仍然是IPV4。

這會導致什麼?這是否與Chrome有關,也許是瀏覽器的更新?還是更有可能成爲我的環境?

回答

1

您不能依靠HttpServletRequest.getLocalAddr()來始終返回IPv4地址。相反,你應該要麼被檢查,如果該地址是IPv4或IPv6地址,並採取相應的行動

InetAddress inetAddress = InetAddress.getByName(request.getRemoteAddr()); 
if (inetAddress instanceof Inet6Address) { 
    // handle IPv6 
} else { 
    // handle IPv4 
} 

或解決「localhost」的所有可能的地址,並符合針對

Set<String> localhostAddresses = new HashSet<String>(); 
localhostAddresses.add(InetAddress.getLocalHost().getHostAddress()); 
for (InetAddress address : InetAddress.getAllByName("localhost")) { 
    localhostAddresses.add(address.getHostAddress()); 
} 

if (localhostAddresses.contains(request.getRemoteAddr())) { 
    // handle localhost 
} else { 
    // handle non-localhost 
} 

看到遠程地址this useful post

+0

有用的知道,並給我一個解決方案。我仍然想知道爲什麼我上週看到了IPv4地址,但本週是IPv6地址。 –

+0

默認情況下,IPv6(如果可用)應該優先於v4,如果您已經支持v6,那麼您很可能會獲得v4連接。也許Chrome更新或環境更改?如果您想強制使用IPv4或v6,請檢查以下兩個Java標誌:http://download.java.net/jdk7/archive/b123/docs/api/java/net/doc-files/net-properties.html –