【发布时间】:2016-06-21 18:18:39
【问题描述】:
我正在实现一个 Spring Boot + WebSocket + SockJS 应用程序,并且对如何处理 HTTP 会话/Websocket 关系有疑问。
基本上,我希望能够通知用户他的会话已失效(因为超时或从其他位置登录)。为此,我想在框架关闭之前将某个消息放入他自己的套接字中。
我转向了一个 http 侦听器,但我遇到的问题是,在调用 HttpSessionListener.sessionDestroyed() 时,我可以看到框架已经关闭了套接字(不是由于其他一些事件,例如用户关闭浏览器) .
有人知道如何实现这一目标吗?
我有一个非常简单的 Websocket 配置,并且使用 Spring Boot 默认值运行。
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureWebSocketTransport(WebSocketTransportRegistration registration) {
registration.setMessageSizeLimit(10000000);
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.setApplicationDestinationPrefixes("/app/");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/myEndPoint").withSockJS();
}
}
安全部分:
@Configuration
public class WebSocketSecurityConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer {
@Override
protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) {
applySecurity(messages);
}
@Override
protected boolean sameOriginDisabled() {
return true;
}
private static void applySecurity(MessageSecurityMetadataSourceRegistry messages) {
messages.nullDestMatcher().authenticated() //
.simpDestMatchers("/app/**").authenticated().simpSubscribeDestMatchers("/user/reply").authenticated()
.simpTypeMatchers(MESSAGE, SUBSCRIBE).denyAll().anyMessage().denyAll();
}
}
我的 Http 监听器是这样的:
return new HttpSessionListener() {
@Override
public void sessionDestroyed(HttpSessionEvent se) {
simpMessagingTemplate.convertAndSendToUser(....);
}
@Override
public void sessionCreated(HttpSessionEvent se) {
// no need to do anything when a session is created
}
};
更新:
Spring-session 处理此类问题以及许多其他问题。
【问题讨论】:
标签: java spring httpsession spring-websocket