【问题标题】:Websocket getting remote IP on connectWebsocket在连接时获取远程IP
【发布时间】:2014-11-12 20:36:24
【问题描述】:

我可以在@ServletEndpoint 类的@OnOpen 方法中获取远程IP 地址吗? 我尝试遵循此Accessing HttpSession from HttpServletRequest in a Web Socket @SocketEndpoint,但与Websocket - httpSession returns null 一样,它不起作用。

反正我只需要客户端 IP 地址。

【问题讨论】:

    标签: java websocket


    【解决方案1】:

    添加:适用于 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 实现。
    • @Benjamin 我同意。我正在使用 Jetty 实现,但当时没有找到答案。然后我尝试了它的大部分 API 来为我找到解决方案并在此处发布答案。我还没有尝试任何其他实现。
    • 对于 Tomcat,有一个反射解决方法:stackoverflow.com/a/32629586/166524
    • @AereXu 如果 Jetty 在 NGINX 后面,这将不起作用。
    【解决方案2】:

    JSR-356 Websocket 规范不公开客户端 IP 地址。

    您可以尝试此回复中描述的 2 种技巧之一: JSR-356 WebSockets with Tomcat - How to limit connections within single IP address?

    【讨论】:

    • 好的,我使用了 httpSession 和 ServletRequestListener,它对我有用。谢谢。
    猜你喜欢
    • 2019-10-24
    • 1970-01-01
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 2017-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多