我正在编写一个带有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");
}
}
错误是:地图是不可变的
答案 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())
希望这会有所帮助