如何在春季WebSocketStompClient中获取会话ID?

2022-09-05 00:15:16

如何在Java Spring WebSocketStompClient中获取会话ID?

我有WebSocketStompClient和StompSessionHandlerAdapter,它们实例可以很好地连接到我服务器上的websocket。WebSocketStompClient 使用 SockJsClient.
但我不知道如何获取websocket连接的会话ID。在客户端具有单踏会话处理程序的代码中

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

stomp 会话包含会话 ID,它与服务器上的会话 ID 不同。所以从这个ids:

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

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

我需要第一个会话ID,来自WebSocketClientSockJsSession。但是我没有在WebSocketStompClient或SockJsClient中找到任何方法来检索诸如会话id之类的东西...


答案 1

要获取会话 ID,您需要定义自己的拦截器,如下所示,并将会话 ID 设置为自定义属性。

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;
    }

现在,您可以在控制器类中获取相同的会话 ID。

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

    }

答案 2

您可以使用注释来访问会话 Id:@Header

@MessageMapping("/login")
public void login(@Header("simpSessionId") String sessionId) {
    System.out.println(sessionId);
}

它对我来说工作正常,没有任何自定义拦截器


推荐