java - 如何从客户端出站 channel 访问 websocket 客户端入站 channel 拦截器中填充的 STOMP getSessionAttributes()?

标签 java spring-websocket

我正在使用 spring-websocket 并且我有这两个拦截器

<websocket:client-inbound-channel>
    <websocket:executor core-pool-size="100" max-pool-size="200" keep-alive-seconds="600"/>
    <websocket:interceptors>
        <ref bean="myInterceptor"/>
    </websocket:interceptors>
</websocket:client-inbound-channel>


<websocket:client-outbound-channel>
    <websocket:executor core-pool-size="100" max-pool-size="200" keep-alive-seconds="600"/>
    <websocket:interceptors>
        <ref bean="myOutInterceptor"/>
    </websocket:interceptors>
</websocket:client-outbound-channel>

我正在使用 StompHeaderAccessor 将消息包装在 preSend(Message<?> message, MessageChannel channel) 中在两个拦截器中。

我使用以下内容来访问入站拦截器中的 session 属性:

...
StompHeaderAccessor sha = StompHeaderAccessor.wrap(message);
// ignore non-STOMP messages like heartbeat messages
if(sha.getCommand() == null) {
    return message;
}
String sessionId = sha.getSessionId();
Map<String, Object> sessionAttributes = sha.getSessionAttributes();
...

问题是,sha.getSessionAttributes();在入站拦截器中返回数据,但是当我调用 sha.getSessionAttributes(); 时在出站拦截器中,它返回 null。

如何从出站拦截器访问 sessionAttributes?

最佳答案

这感觉像是一个解决方法。我就是这样解决的。

我添加了一个类似于包含 Map 的存储库的 bean,键是 session ID,值是 session 属性。

在入站拦截器中,在 SUBSCRIBE 情况下,我将 session ID 与属性一起放入。并将其从 map 中删除,以防取消订阅和断开连接。

在出站拦截器中,例如 MESSAGE,我从该 bean sessionAttributes = theBean.getSessionIdAndAttributes().get(sessionId) 获取了相关的 sessionAttributes,而不是从消息对象 sessionAttributes = sha.getSessionAttributes() 获取它。

关于java - 如何从客户端出站 channel 访问 websocket 客户端入站 channel 拦截器中填充的 STOMP getSessionAttributes()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53388803/

相关文章:

java - 在字符串数组中搜索子字符串并返回多个值的最有效方法?

Java 自然排序

java - 为什么Java的invokevirtual需要解析被调用方法的编译时类?

java - Spring WebSocket集成测试 Artifact 哪里找?

java - Spring 4 Web 套接字 - 我必须有 stomp 代理吗?

java - 如何停止在 JFrame 中调整 JPanel 的大小

java - 在 Eclipse 中本地调试 Web 服务

javascript - stompjs xhr_streaming 超时

spring - 与 Spring-Websocket 中的简单内存中代理相比,使用专用 STOMP 代理有什么好处?

reactjs - 如何使用 springboot 和 reactjs 正确配置 websocket?