如何在 javax.websocket 服务器中获取远程客户端地址?

How to get remote client address in javax.websocket server?

我有一个运行 websocket webapp 的 jetty 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 地址的正确方法是什么?

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

当我试图将其转换为 TyrusSession 时我得到了线索,而 Jetty 在错误日志中抱怨(提出 ClassCastException)说这是一个无法转换为 JsrSession一个TyrusSession。但是,我刚刚在我的日志中打印了 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'

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