我正在使用 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/