Java 在GWT和Google App Engine中获取客户端IP地址

Java 在GWT和Google App Engine中获取客户端IP地址,java,google-app-engine,gwt,Java,Google App Engine,Gwt,我需要在GWT/GAE(Java)应用程序中捕获客户端的IP地址。由于GAE不支持全套java.net API,我无法编写下面的代码片段。有人能提出实现同样目标的可靠方法吗 for (final Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { final NetworkInterface intf = en.nextElem

我需要在GWT/GAE(Java)应用程序中捕获客户端的IP地址。由于GAE不支持全套java.net API,我无法编写下面的代码片段。有人能提出实现同样目标的可靠方法吗

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


但是什么是Java等价物呢?

好的-明白了。在应扩展
RemoteServiceServlet
的Servlet中,执行以下操作:

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

例如,如果您在代理后面,如果您使用ProxyPass和ProxyPassReverse,您会发现以下内容非常有用:

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

实际上,如果您想要IP地址,可能需要使用getRemoteAddr而不是getRemoteHost

String ip   = getThreadLocalRequest().getRemoteAddr();
String host = getThreadLocalRequest().getRemoteHost();
  • getRemoteAddr提供客户端的internet协议(IP)地址
  • getRemoteHost提供客户端的完全限定名,如果主机名为空,则提供IP
请参阅Oracle Javadoc:

我看到了这一点,并不是故意放肆。只是想指出getRemoteAddr和getRemoteHost之间的区别。
this.getThreadLocalRequest().getHeader("X-FORWARDED-FOR") 
String ip   = getThreadLocalRequest().getRemoteAddr();
String host = getThreadLocalRequest().getRemoteHost();