我有一个ServerEndpoint
和一个ClientEndpoint
通过相应的编码器/解码器交换JSON消息。
现在我想添加客户端选择唯一用户名的功能。
假设我有一个fun isNameAvailable(name: String): Boolean
(当然在服务器上)。
没有尝试过,但我认为我可以使用WebFilter
s来保护对WebSocket端点的访问。 (例如,假设我连接到ws://localhost:8888/ws/foo
,我添加了一个拦截对/ws/*
的所有访问的Web过滤器),我会在其中重复查询用户的用户名并拒绝它,直到isNameAvailable
返回true
。
但据我了解,一旦添加非浏览器客户端,就会失败。
你怎么写“自定义握手”?
即我想反复在String
的ServerEndpoint
中查询客户端的@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
的客户端连接
也许看看创建自定义ServerEndpointConfig.Configurator并重载modifyHandshake()方法并将此实例作为@ServerEndpoint注释的configurator属性应用于服务器端点?类似的答案:https://stackoverflow.com/a/21766822/11133168
您还可以在第18.10章的“The Java EE 7 Tutorial”一书中找到有关此主题的更多详细信息