在Spring / Stomp / Websocket / Messaging中更改会话ID

时间:2017-08-24 15:39:20

标签: java spring session stomp

我正在编写一个带有spring messaging和stomp以及rabbitmq的应用程序。我的应用程序已经将消息从浏览器发送到rabbitmq并返回。但我不希望基于会话ID的预定义rabbitmq队列名称。我想在connect上更改会话ID。这就是我的尝试:

@Component
public class MyListener {

    private Logger logger = LoggerFactory.getLogger(getClass().getSimpleName());

    @EventListener
    public void x(SessionConnectEvent event) {
        Map<String, Object> headers = event.getMessage().getHeaders();
        String id = headers.get("simpSessionId").toString();
        logger.info("My current session id is " + id);
        headers.put("sessionId", "fred");
    }
}

错误是:地图是不可变的

3 个答案:

答案 0 :(得分:0)

您需要在客户端&lt; - &gt;之间完成握手之前更新from: server,即定义头属性的时候。

另一方面,侦听器sessionId仅在握手完成后执行。

SessionConnectEvent

另外,不要忘记在特定端点上注册拦截器

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", "mySessiond");
    }
    return true;
}

public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,
        Exception ex) {
}
}

答案 1 :(得分:0)

更改会话ID不是正确的方法。我使用ServletFilter进行Cookie和安全检查,使用@SendTo正确使用rabbitmq队列。

答案 2 :(得分:0)

您可以通过为每次握手创建一个Principal来更改会话ID,然后您可以 使用提供的用户名定位每个已连接的会话:

class CustomHandshake extends DefaultHandshakeHandler {
    @Override
    public Principal determineUser(ServerHttpRequest request, WebSocketHandler wsHandler, Map<String, Object> attributes) {
        Principal principal = request.getPrincipal();
        if (principal == null) {
            principal = new AnonymousPrincipal();

            String uniqueName = UUID.randomUUID().toString();

            ((AnonymousPrincipal) principal).setName(uniqueName);
        }

        return principal;
    }

}

别忘了按以下方式注册处理程序:

.setHandshakeHandler(new CustomHandshake())

希望这会有所帮助