У меня есть ServerEndpoint
и ClientEndpoint
, обменивающиеся сообщениями JSON через соответствующие кодеры / декодеры.
Теперь я хочу добавить возможность для клиента выбирать уникальное имя пользователя.
Допустим, у меня есть fun isNameAvailable(name: String): Boolean
(на сервере, конечно).
Не пробовал, но я думаю, что мог бы использовать WebFilter
s для защиты доступа к конечным точкам WebSocket.,(например, допустим, я подключаюсь к ws://localhost:8888/ws/foo
и добавляю веб-фильтр, который перехватывает все обращения к /ws/*
), в котором я бы неоднократно запрашивал у пользователя имя пользователя и отклонял его до тех пор, пока 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