Я знаю - старый нить, но я не вижу каких-либо улучшений по этому поводу. Поэтому, возможно, кто-то может обсудить мое решение этой проблемы.
Я попробовал версию Леос, работает Wildfly 8.0, Undertow 1.0
final ArrayList<String> finalEmpty = new ArrayList<String>();
response.getHeaders().put(HandshakeResponse.SEC_WEBSOCKET_ACCEPT,finalEmpty);
Это вызовет некоторое забавное поведение:
Даже если ваш браузер должен закрыть соединение, все они будут проходить через onOpen()
процедуры ,
- Хром: активирует
onOpen()
, затем триггеры onError()
. В моем случае , я делаю некоторую регистрацию об отключенных клиентах, поэтому я всегда звоню onClose()
при возникновении ошибки.
- IE: Будет действовать как Chrome
- Firefox: Firefox просто запустит процедуру onOpen(). И не будет запускать onError(). Поэтому ваш сервер даже не знает, что клиент отключен.
Не испортите свои заголовки и не позволяйте клиенту выполнять работу по плотности.
Вместо этого вы должны добавить данные аутентификации в конфигурацию.
/** some verification foo code...**/
config.getUserProperties().put("isValid",true);
в onOpen()
вы затем проверить для значения IsValid. Если это не так, вы вызываете onClose(session,null);
. и сессия будет закрыта.
Это не лучшее решение, но это потому, что аутентификация websocket отстойна, и каждый браузер иногда действует по-разному. См.: Websocket: Closing browser triggers onError() in chrome but onClose() event in Firefox
это должно сработать, но только для более чистой реализации я бы предложил внедрить фильтр сервлета и проверить там запрос. –
Привет @Leo, я уже пробовал этот подход раньше, но он не работает (по крайней мере, на Кот). Мне кажется, что код сервера устанавливает заголовок 'Sec-WebSocket-Accept' после вызова' modifyHandshake() '. При печати заголовков ответа внутри 'modifyHandshake()', как это: 'logger.info ("response.getHeaders() =>" + response.getHeaders());' Мы получаем это: 'ответ. getHeaders() => {} ' –
ну, я тестировал его с wildfly, который использует swow, я полагаю, это может быть деталь реализации. – Leo