Область запроса или сеанса в Spring Websocket

Из конечной точки WebSocket я пытаюсь вызвать службу Singleton. Но я не могу использовать область запроса или сеанса из WebSocket.

(@Scope(значение = "запрос", proxyMode = ScopedProxyMode.TARGET_CLASS))

Я получаю сообщение Область «запрос» не активна для текущего потока; Для области «запрос» или «сеанс» в любом «ScopedProxyMode».

Спасибо за помощь!


person Tonci Jelavic    schedule 10.08.2015    source источник


Ответы (3)


Для веб-сокетов нет запроса/ответа, поэтому область запроса недействительна. Они представили новую область под названием websocket в Spring 4.1. @Scope(name = "websocket", proxyMode = ScopedProxyMode.TARGET_CLASS). Пример реферальной ссылки

http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#websocket-stomp-websocket-scope

person Abhinay    schedule 21.09.2015
comment
Хотя я знаю об этой новой области, она не помогает извлекать данные (например, текущий пользователь, вошедший в систему), которые уже существуют во внешней области сеанса. Любые идеи, как получить к этому доступ? Мой клиент отправляет файлы cookie, которые связаны с моей областью сеанса сервера, во время http-рукопожатия для его первоначального подключения, но как мне найти эту область внутри Spring? - person Periata Breatta; 22.12.2016

Я не уверен насчет Spring, но если вы построили свой код веб-сокета в соответствии со стандартом JSR-356 (который Spring должен понимать), вы можете добавить собственный конфигуратор в определение конечной точки, где вы можете перехватить рукопожатие. См. javax.websocket.server.ServerEndpointConfig.Configurator.modifyHandshake(ServerEndpointConfig, HandshakeRequest, HandshakeResponse), тогда вы, возможно, сможете получить фактический объект сеанса, но это будет зависеть от вашего сервера приложений. Вы точно сможете получить любые параметры и заголовки.

Это немедленный ответ, однако лучшим подходом к проектированию было бы в первую очередь исключить любую зависимость от сеансов.

person Lev Kuznetsov    schedule 14.02.2017

Вы можете использовать

@Scope(name = "websocket", proxyMode = ScopedProxyMode.TARGET_CLASS)

Но это также синглтон, а не область сеанса. https://docs.spring.io/spring/docs/4.2.x/spring-framework-reference/html/websocket.html

person lmybill    schedule 11.09.2020