【发布时间】:2014-11-12 20:36:24
【问题描述】:
我可以在@ServletEndpoint 类的@OnOpen 方法中获取远程IP 地址吗?
我尝试遵循此Accessing HttpSession from HttpServletRequest in a Web Socket @SocketEndpoint,但与Websocket - httpSession returns null 一样,它不起作用。
反正我只需要客户端 IP 地址。
【问题讨论】:
我可以在@ServletEndpoint 类的@OnOpen 方法中获取远程IP 地址吗?
我尝试遵循此Accessing HttpSession from HttpServletRequest in a Web Socket @SocketEndpoint,但与Websocket - httpSession returns null 一样,它不起作用。
反正我只需要客户端 IP 地址。
【问题讨论】:
添加:适用于 Jetty 实施,它不是一个常见的解决方案。感谢本杰明!
不知道你是否还需要它。我自己直接从socket Session中获取IP。
@OnOpen
public void onWebSocketConnect(Session session) {
System.Out.println(session.getUserProperties().get("javax.websocket.endpoint.remoteAddress"))
}
然后我得到 /127.0.0.1:57045
【讨论】:
javax.websocket.endpoint.remoteAddress 属性不是 JSR-356 的一部分(请参阅 jcp.org/en/jsr/detail?id=356)。我怀疑这是 Jetty 的 websocket 实现所特有的。例如,我在使用 Undertow 的 WildFly 8.2 上进行了尝试,session.getUserProperties() 返回一个没有预定义值的 Map...所以这个解决方案不可移植,可能不适用于所有 websocket 实现。
JSR-356 Websocket 规范不公开客户端 IP 地址。
您可以尝试此回复中描述的 2 种技巧之一: JSR-356 WebSockets with Tomcat - How to limit connections within single IP address?
【讨论】: