2017-02-15 30 views
2

Как получить идентификатор сеанса в Java Spring WebSocketStompClient?Как получить идентификатор сеанса весной WebSocketStompClient?

У меня есть WebSocketStompClient и StompSessionHandlerAdapter, в которых экземпляры прекрасно подключаются к websocket на моем сервере. WebSocketStompClient использует SockJsClient.
Но я не знаю, как получить идентификатор сеанса связи в сети. В коде обработчика с топает сеанс на стороне клиента

private class ProducerStompSessionHandler extends StompSessionHandlerAdapter { 
      ... 
      @Override 
      public void afterConnected(StompSession session, StompHeaders connectedHeaders) { 
      ... 
      } 

топает сеанс содержит идентификатор сеанса, который отличается от идентификатора сеанса на сервере. Так что с этого ид:

DEBUG ... Processing SockJS open frame in WebSocketClientSockJsSession[id='d6aaeacf90b84278b358528e7d96454a... 

DEBUG ... DefaultStompSession - Connection established in session id=42e95c88-cbc9-642d-2ff9-e5c98fb85754 

мне нужно первый идентификатор сеанса, из WebSocketClientSockJsSession. Но я не нашел в WebSocketStompClient или SockJsClient какой-либо метод для получения чего-то вроде идентификатора сеанса ...

ответ

2

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

public class HttpHandshakeInterceptor implements HandshakeInterceptor { 

    @Override 
    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, 
      Map attributes) throws Exception { 
     if (request instanceof ServletServerHttpRequest) { 
      ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request; 
      HttpSession session = servletRequest.getServletRequest().getSession(); 
      attributes.put("sessionId", session.getId()); 
     } 
     return true; 
    } 

Теперь вы можете получить тот же идентификатор сеанса в классе контроллера.

@MessageMapping("/message") 
public void processMessageFromClient(@Payload String message, SimpMessageHeaderAccessor headerAccessor) throws Exception { 
     String sessionId = headerAccessor.getSessionAttributes().get("sessionId").toString(); 

    } 

Ссылка: Maintaining spring session with stomp websocket

+0

Спасибо! Из-за того, что сервер работает с клиентом javascript, я отправляю идентификатор сеанса в java-клиент по его запросу. – Irina

+0

Вместо написания собственного перехватчика вы можете использовать встроенный ['HttpSessionHandshakeInterceptor'] (https://docs.spring.io/spring-framework/docs/5.0.0.RELEASE/javadoc-api/org/ springframework/веб/розетка/сервер/поддержка/HttpSessionHandshakeInterceptor.html). – izstas