没有从标题

时间:2016-06-12 17:36:40

标签: spring-websocket spring-session

我正在使用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下处理激活会话?或者更具体地说:

  • 为什么SessionRepositoryMessageInterceptor使用SimpleHeaderAccessor而不是StompHeaderAcessor?
  • 我需要从javascript客户端传递哪些标头来创建会话(假设我通过传统登录获得了会话ID)?

1 个答案:

答案 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调用。