2009-12-02 100 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