Spring Session -- WebSocket Integration WebSocket 集成
官网:https://spring.io/projects/spring-session
Samples:https://docs.spring.io/spring-session/reference/samples.html#samples
指引
- Spring Session – HttpSession Integration HttpSession集成
- Spring Session – WebSocket Integration WebSocket 集成
- Spring Session – WebSession Integration WebSession 集成
- Spring Session – Spring Security Integration Spring Security 集成
WebSocket Integration WebSocket 集成
Spring Session 提供了与 Spring 的 WebSocket 支持的透明集成。提供 HttpSession,因为根据 JSR-356,如果 HttpSession 超时,任何使用 HttpSession 创建的 WebSocket 和经过身份验证的用户都应该被强制关闭
WebSocket 使用
HttpSession 集成
在使用 WebSocket 集成之前,应该首先确保 HttpSession 集成工作
Spring 配置
在典型的Spring WebSocket应用程序中,将实现WebSocketMessageBrokerConfigurer
@Configuration
@EnableScheduling
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/messages").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/queue/", "/topic/");
registry.setApplicationDestinationPrefixes("/app");
}
}
可更新配置来使用 Spring Session 的 WebSocket 支持
@Configuration
@EnableScheduling
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractSessionWebSocketMessageBrokerConfigurer<Session> {
@Override
protected void configureStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/messages").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/queue/", "/topic/");
registry.setApplicationDestinationPrefixes("/app");
}
}
- 继承 AbstractSessionWebSocketMessageBrokerConfigurer 不是实现 WebSocketMessageBrokerConfigurer
- 将 registerStompEndpoints 方法重命名为 configureStompEndpoints 方法
AbstractSessionWebSocketMessageBrokerConfigurer 工作原理
AbstractSessionWebSocketMessageBrokerConfigurer 工作原理
- WebSocketConnectHandlerDecoratorFactory 实现 WebSocketHandlerDecoratorFactory 接口,被添加到 WebSocketTransportRegistration。确保触发一个包含 WebSocketSession 的自定义 SessionConnectEvent(WebSocketSession 是结束任何仍然开启的 WebSocket 连接所必需的)
- SessionRepositoryMessageInterceptor 实现 HandshakeInterceptor 接口,被添加到每个 StompWebSocketEndpointRegistration。确保会话被添加到 WebSocket 属性中,以更新最后访问时间
- SessionRepositoryMessageInterceptor 实现 ChannelInterceptor 接口,被添加到入站 ChannelRegistration。确保每次接收到入站消息时,都会更新Spring会话的最后访问时间
- WebSocketRegistryListener 实现 ApplicationListener 接口,监听会话事件。确保了获取所有 WebSocketSession 的 SessionId 到相应 WebSocket 连接的映射。通过维护这个映射,可在一个 Spring 会话(HttpSession)结束时关闭所有的 WebSocket 连接