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

标签 java spring session stomp

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

相关文章:

node.js - Passport.js - 在 session 中存储信息

java - 异步插入后无法从android sqlite数据库检索数据

java - 使用 ant 创建 Android 项目的源代码分发

java - 单页应用程序: page reload

java - 将 MongoDB ObjectId 序列化为字符串

java - Freemarker - 只对 bean 使用 getter

php - 奇怪的 session /URL 错误

java - 当前正在运行的线程在 sleep 时是否持有锁?

java - 为 Hibernate 域对象创建元表

php - 在购物车 session 中存储和检索 woocommerce 自定义数据