【问题标题】:How to get remote client address in javax.websocket server?如何在 javax.websocket 服务器中获取远程客户端地址?
【发布时间】:2016-01-22 16:47:49
【问题描述】:

我有一个运行 websocket webapp 的码头 9.3.6 服务器。我想获取客户端 IP 地址用于簿记目的,我可以在 javax.websocket.Session 对象中看到它,但我不知道如何获取它,因为 API 不允许这样做。有些人似乎将它转换为TyrusSession 对象(来自org.glassfish.tyrus.core.TyrusSession),但是当我尝试这样做时,它编译得很好,但在运行时在websocket 服务器中引发了ClassCastException。我在build.gradle 中包含以下内容:

compile 'org.glassfish.tyrus:tyrus-core:1.12' 

javax.websocket.Session 中获取客户端 IP 地址的正确方法是什么?

【问题讨论】:

    标签: java jetty-9 java-websocket


    【解决方案1】:

    SO rules一致,我在这里回答我自己的问题。

    当我尝试将其转换为 TyrusSession 时,我得到了线索,而 Jetty 在错误日志中抱怨(引发 ClassCastException)说这是一个不能转换为 TyrusSessionJsrSession。然而,我刚刚在我的日志中打印了Session 对象,并且出现了类似这样的内容:

    session: WebSocketSession[....]
    

    然后我尝试将其转换为 org.eclipse.jetty.websocket.common.WebSocketSession,然后抱怨该对象实际上是 JsrSession,这导致我发现了以下解决方案:

    @ServerEndpoint (value="/mySillyApp", configurator= ..., decoders={...})
    public class MySillyWebSocketServer
    {
        @OnOpen
        public void open (Session session, EndpointConfig config)
        {
            JsrSession jsrSession = (JsrSession) session; // import org.eclipse.jetty.websocket.jsr356.JsrSession;
            WebSocketSession webSocketSession = jsrSession.getWebSocketSession (); // import org.eclipse.jetty.websocket.common.WebSocketSession;
            String clientIPAddressString = webSocketSession.getRemoteAddress ().getHostString ();
            ....
        }
        ...
    }
    

    显然,您必须在类路径中包含适当的 jar。对于 gradle,您可以在 dependencies {...} 部分执行此操作:

      compile 'org.eclipse.jetty.websocket:javax-websocket-client-impl:9.3.6.v20151106'
      compile 'org.eclipse.jetty.websocket:websocket-common:9.1.0.v20131115'
    

    希望我的方法和细节对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-06
      • 2011-06-08
      • 2012-12-24
      • 1970-01-01
      • 1970-01-01
      • 2021-05-14
      • 1970-01-01
      相关资源
      最近更新 更多