自定义websocket握手

问题描述 投票:0回答:1

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

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

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

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

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

你怎么写“自定义握手”?

即我想反复在StringServerEndpoint中查询客户端的@OnOpen,直到一个适合,然后继续其余的设置,之后客户端和服务器可以开始交换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 authentication kotlin websocket handshake
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.