我正在使用spring session和AbstractSessionWebSocketMessageBrokerConfigurer,我正在尝试创建一个支持Spring Security和Spring Session的STOMP Websocket。我似乎无法启动会话。我使用webstomp-client连接(https://github.com/JSteunou/webstomp-client)
AbstractSessionWebSocketMessageBrokerConfigurer创建
@Bean
@SuppressWarnings("unchecked")
public SessionRepositoryMessageInterceptor<S> sessionRepositoryInterceptor() {
return new SessionRepositoryMessageInterceptor<S>(this.sessionRepository);
}
我将标题传递给connect事件和每条消息
SPRING.SESSION.ID:<My session id>
当我检查SessionRepositoryMessageInterceptor中的处理时,我看到它正在尝试通过SimpMessageHeaderAccessor检索会话ID,该会话ID期望头部在头部密钥simpSessionAttributes下包含一个对象。
Map<String, Object> sessionHeaders = SimpMessageHeaderAccessor
.getSessionAttributes(message.getHeaders());
String sessionId = sessionHeaders == null ? null
: (String) sessionHeaders.get(SPRING_SESSION_ID_ATTR_NAME);
SimpMessageHeaderAccessor似乎期望的所有属性都不存在于stomp客户端中,并且似乎属于不同的协议。
如何在Stomp,Spring WebSocket,Spring Security和Spring Session下处理激活会话?或者更具体地说:
答案 0 :(得分:1)
我不知道问题所在,但我可以解释一些事情来帮助您调试问题。
Spring支持WebSocket范围的属性。只要会话存在,这些属性就存在。 SessionRepositoryMessageInterceptor作为HandshakeInterceptor挂钩到初始HTTP握手请求,并将SPRING.SESSION.ID保存为WebSocket-scoped属性。然后在握手之后,当STOMP消息开始流动时,它拦截每个传入的消息,并检索websocket属性中的SPRING.SESSION.ID。所以我不确定你为什么要尝试将SPRING.SESSION.ID作为标题传递。这就是我刚才解释并与WebSocket会话相关联的所有内容。
关于SimpHeaderAccessor与StompHeaderAcessor的问题,前者是一个更通用的版本。只要它能为您提供足够的信息,使用它并没有错。在这种情况下,Spring Session并不关心STOMP的具体细节。
我不明白您的第二个问题,即需要从javascript客户端传递哪些标头来创建会话。只要在同一个HTTP会话中进行HTTP握手,它就可以正常工作。这里没有什么不同于你如何进行任何HTTP调用。