Пользовательское рукопожатие - PullRequest
0 голосов
/ 04 марта 2019

У меня есть 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

1 Ответ

0 голосов
/ 04 марта 2019

Может быть, стоит взглянуть на создание пользовательского ServerEndpointConfig.Configurator, перегрузить метод modifyHandshake () и применить этот экземпляр к конечной точке вашего сервера в качестве свойства configurator аннотации @ServerEndpoint?Аналогичный ответ здесь: https://stackoverflow.com/a/21766822/11133168

Более подробную информацию по этой теме вы также можете найти в книге " Учебное пособие по Java EE 7 " в главе 18.10

...