gpt4 book ai didi

java - 更改 Spring/Stomp/Websocket/Messaging 中的 session ID

转载 作者:太空宇宙 更新时间:2023-11-04 11:12:18 24 4
gpt4 key购买 nike

我正在使用 spring 消息传递、stomp 和rabbitmq 编写一个应用程序。我的应用程序已经将消息从浏览器发送到rabbitmq并返回。但我不想要基于 session ID 的预定义的rabbitmq队列名称。我想更改连接时的 session 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");
}
}

错误是: map 是不可变的

最佳答案

您需要在客户端 <-> 服务器之间完成握手之前(即定义 headers 属性时)更新 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) {
}
}

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

 @Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/greeting").addInterceptors(new HttpHandshakeInterceptor());
}

关于java - 更改 Spring/Stomp/Websocket/Messaging 中的 session ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45865820/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com