2009-12-02 129 views
8

我需要在我的GWT/GAE(Java)應用程序中捕獲客戶端的IP地址。由於GAE不支持全套的java.net API,所以我不能做如下代碼片段的代碼。任何人都可以建議可靠的方式來實現相同?在GWT和Google App Engine中獲取客戶端IP地址

for (final Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { 
    final NetworkInterface intf = en.nextElement(); 
    for (final Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) { 
     final InetAddress ip = enumIpAddr.nextElement(); 
     if (!ip.isLoopbackAddress() && !ip.isLinkLocalAddress() && !ip.isAnyLocalAddress()) { 
       return ip.getHostAddress().toString(); 
     } 
    } 
} 

對於Python版本,一個可以這樣做:

os.environ['REMOTE_ADDR'] 

String ip = self.request.remote_addr; 

但是這將是一個Java等同?

回答

15

好的 - 明白了。在servlet應當擴大RemoteServiceServlet做到這一點:

final String ip = getThreadLocalRequest().getRemoteAddr(); 
6

如果你使用代理服務器,例如,如果你使用的ProxyPass和ProxyPassReverse你能找到有用的:如果你

this.getThreadLocalRequest().getHeader("X-FORWARDED-FOR") 
0

其實需要您可能想要使用的IP地址getRemoteAddr而不是getRemoteHost。

String ip = getThreadLocalRequest().getRemoteAddr(); 
String host = getThreadLocalRequest().getRemoteHost(); 
  • 的getRemoteAddr爲您提供客戶端的互聯網協議(IP)地址。
  • getRemoteHost爲您提供客戶端的完全限定名稱,如果主機名爲空,則爲IP。

參閱Oracle的Javadoc: http://docs.oracle.com/javaee/7/api/javax/servlet/ServletRequest.html#getRemoteAddr%28%29

+0

這就是我在自己接受的答案顯示 – Bostone 2013-06-21 18:44:43

+0

看到後,並不意味着是放肆。只是想指出getRemoteAddr和getRemoteHost之間的區別。 – mlkammer 2013-08-06 08:16:29