代码之家  ›  专栏  ›  技术社区  ›  Bostone

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

  •  8
  • Bostone  · 技术社区  · 15 年前

    我需要在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();
            }
        }
    }
    

    os.environ['REMOTE_ADDR'] 
    

    String ip = self.request.remote_addr;
    

    但是什么是Java等价物呢?

    3 回复  |  直到 14 年前
        1
  •  15
  •   Bostone    15 年前

    好的,明白了。在您的Servlet中,哪个应该扩展 RemoteServiceServlet

    final String ip = getThreadLocalRequest().getRemoteAddr();
    
        2
  •  6
  •   amanas    13 年前

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

    this.getThreadLocalRequest().getHeader("X-FORWARDED-FOR") 
    
        3
  •  0
  •   mlkammer    11 年前

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

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

    http://docs.oracle.com/javaee/7/api/javax/servlet/ServletRequest.html#getRemoteAddr%28%29