在使用springboot的websocket功能stomp时,不能直接获取websocketsession,下面提供一个方法。
stomp配置可参考之前文章:配置websocket
添加WebSocketHandler
public class CustomSubProtocolWebSocketHandler extends SubProtocolWebSocketHandler {
private static final Logger LOGGER = LoggerFactory.getLogger(CustomSubProtocolWebSocketHandler.class);
// @Autowired
private SessionHandler sessionHandler;
public CustomSubProtocolWebSocketHandler(MessageChannel clientInboundChannel, SubscribableChannel clientOutboundChannel) {
super(clientInboundChannel, clientOutboundChannel);
}
public CustomSubProtocolWebSocketHandler(MessageChannel clientInboundChannel,
SubscribableChannel clientOutboundChannel, SessionHandler sessionHandler) {
super(clientInboundChannel, clientOutboundChannel);
this.sessionHandler = sessionHandler;
}
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
LOGGER.info("New websocket connection was established");
sessionHandler.register(session);
super.afterConnectionEstablished(session);
}
}
其中afterConnectionEstablished,负责能够在建立websocket连接时获取session,这里的sessionHandler就是对这个session的处理了。
将CustomSubProtocolWebSocketHandler配置一下就可以了
@EnableWebSocketMessageBroker
public class WebSocketStompConfig /*extends AbstractWebSocketMessageBrokerConfigurer*/
extends WebSocketMessageBrokerConfigurationSupport implements WebSocketMessageBrokerConfigurer {
@Autowired
private AbstractAuthService authService;
@Autowired
private SessionHandler sessionHandler;
/**
* 注册stomp的端点
*/
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
// 允许使用socketJs方式访问,访问点为webSocketServer,允许跨域
// 在网页上我们就可以通过这个链接
// http://localhost:8080/webSocketServer
// 来和服务器的WebSocket连接
registry.addEndpoint("/webSocketServer")
// .addInterceptors(new SessionAuthHandshakeInterceptor())
.setAllowedOrigins("*")
.withSockJS();
}
/**
* 配置信息代理
*/
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
// 订阅Broker名称
registry.enableSimpleBroker("/queue", "/topic");
// 全局使用的消息前缀(客户端订阅路径上会体现出来)
registry.setApplicationDestinationPrefixes("/app");
// 点对点使用的订阅前缀(客户端订阅路径上会体现出来),不设置的话,默认也是/user/
registry.setUserDestinationPrefix("/user/");
}
/**
* 配置客户端入站通道拦截器
*/
@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
registration.interceptors(createUserInterceptor());
}
@Override
public void configureClientOutboundChannel(ChannelRegistration registration) {
super.configureClientOutboundChannel(registration);
}
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
super.addArgumentResolvers(argumentResolvers);
}
@Override
public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers) {
super.addReturnValueHandlers(returnValueHandlers);
}
@Override
public boolean configureMessageConverters(List<MessageConverter> messageConverters) {
return super.configureMessageConverters(messageConverters);
}
/*将客户端渠道拦截器加入spring ioc容器*/
@Bean
public UserInterceptor createUserInterceptor() {
UserInterceptor userInterceptor = new UserInterceptor();
userInterceptor.setAuthService(authService);
return userInterceptor;
}
@Override
public void configureWebSocketTransport(WebSocketTransportRegistration registration) {
registration.setMessageSizeLimit(500 * 1024 * 1024);
registration.setSendBufferSizeLimit(1024 * 1024 * 1024);
registration.setSendTimeLimit(200000);
}
@Override
@Bean
public WebSocketHandler subProtocolWebSocketHandler() {
return new CustomSubProtocolWebSocketHandler(clientInboundChannel(), clientOutboundChannel(), sessionHandler);
}
}
本文暂时没有评论,来添加一个吧(●'◡'●)