【发布时间】: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 8、Kotlin 1.3.21,在Glassfish 5服务器上运行并由基于Glassfish Tyrus 1.15的客户端连接。我会将信息添加到帖子中。
标签: java authentication kotlin websocket handshake