【问题标题】:Custom websocket handshake自定义 websocket 握手
【发布时间】:2019-03-04 10:45:44
【问题描述】:

我有一个 ServerEndpoint 和一个 ClientEndpoint 通过各自的编码器/解码器交换 JSON 消息。

现在我想为客户端添加选择唯一用户名的功能。

假设我有一个fun isNameAvailable(name: String): Boolean(当然是在服务器上)。

没有尝试过,但我认为我可以使用WebFilters 来保护对 WebSocket 端点的访问。 (例如,假设我连接到 ws://localhost:8888/ws/foo 并添加了一个 Web 过滤器来拦截对 /ws/* 的所有访问),在该过滤器中,我会反复向用户查询用户名并拒绝它,直到 isNameAvailable 返回 true

但据我了解,一旦添加非浏览器客户端,它就会失败。

如何编写“自定义握手”?

即我想从ServerEndpoint@OnOpen 中重复向客户端查询String,直到一个合适,然后才继续进行其余的设置,之后客户端和服务器可以开始交换 JSON 消息.也就是说,像这样:

@ServerEndpoint("/foo")
class FooServerEndpoint{
    @OnOpen
    fun open(session:Session){
        var userName:String
        do{
            userName = requestUserName(session)
        }while(!acceptUserName(userName,session)
    }
}

有没有办法做到这一点?

更新:使用的技术

JavaEE 8/Kotlin 1.3.21,部署到Glassfish 5 服务器并由基于Glassfish Tyrus 1.15 的客户端连接

【问题讨论】:

  • 了解您使用的 java ee/kotlin 版本对读者很有帮助。如果您更新您的问题和/或标签,那就太好了。
  • @FlorianDe 将是JavaEE 8Kotlin 1.3.21,在Glassfish 5 服务器上运行并由基于Glassfish Tyrus 1.15 的客户端连接。我会将信息添加到帖子中。

标签: java authentication kotlin websocket handshake


【解决方案1】:

也许看看创建自定义 ServerEndpointConfig.Configurator 并重载 modifyHandshake() 方法并将此实例作为 @ServerEndpoint 注释的配置器属性应用到您的服务器端点? 类似的答案在这里:https://stackoverflow.com/a/21766822/11133168

您还可以在第 18.10 章的“The Java EE 7 Tutorial”一书中找到有关此主题的更多详细信息

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多