如何在 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'
希望我的方法和详细信息对某人有所帮助。
我有一个运行 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'
希望我的方法和详细信息对某人有所帮助。