【问题标题】:Obtaining clients IP address in GWT and Google App Engine在 GWT 和 Google App Engine 中获取客户端 IP 地址
【发布时间】:2023-04-04 02:30:01
【问题描述】:

我需要在我的 GWT/GAE (Java) 应用程序中捕获客户端的 IP 地址。由于 GAE 不支持全套 java.net API,因此我无法执行下面的 sn-p 之类的代码。任何人都可以提出实现相同目标的可靠方法吗?

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 等价物呢?

【问题讨论】:

    标签: java google-app-engine gwt


    【解决方案1】:

    实际上,如果您想要 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

    【讨论】:

    • 看到了,不是冒昧的意思。只是想指出 getRemoteAddr 和 getRemoteHost 之间的区别。
    【解决方案2】:

    如果您使用代理,例如,如果您使用 ProxyPass 和 ProxyPassReverse,您会发现这样做很有用:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-05-12
        • 2013-06-17
        • 2014-12-29
        • 2019-01-14
        • 2013-07-07
        • 2011-05-26
        • 2019-11-13
        • 1970-01-01
        • 2019-07-12
        相关资源
        最近更新 更多