SpringSecurity结合Stomp使用WebSocket
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketBrokerConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer {
private static final String[] PERMISSIONS_LIST = {
"ROOT", "USER"};
private static final String ENDPOINTS="/stomp/webSocket"
@Resource(name = "webSocketInboundThreadPool")
private ThreadPoolTaskExecutor webSocketInboundThreadPool;
@Resource
private TokenService tokenService;
@Resource
private RedisTemplate<String, Object> redisTemplate;
/**
* 创建WebSocket消息错误处理器
*/
@Bean
public StompSubProtocolErrorHandler stompSubProtocolErrorHandler() {
return new WebSocketErrorHandler();
}
/**
* 创建消息入站拦截器
*/
@Bean
public ChannelInterceptor inboundInterceptor() {
return new WebSocketInboundInterceptor(constant, tokenService, redisTemplate);
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry
//配置错误处理器
.setErrorHandler(stompSubProtocolErrorHandler())
//配置WebSocket对外连接站点
.addEndpoint(constant.getSocketEndpoints())
//允许跨域
.setAllowedOrigins("*")
//使用SocketJS
.withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
//配置客户端订阅地址前缀
registry.enableSimpleBroker(constant.getSocketClientSubscribePrefix(), constant.getSocketClientResponseSubscribePrefix(), constant.getSocketCommonSubPre());
//配置客户端发送消息前缀
registry.setApplicationDestinationPrefixes(constant.getSocketClientSendPrefix());
//配置客户端点对点发送消息前缀
registry.setUserDestinationPrefix(constant.getSocketClientUserPrefix());
}
@Override
protected void customizeClientInboundChannel(ChannelRegistration registration) {
registration
//配置消息入站拦截器
.interceptors(inboundInterceptor())
//配置入站通道线程池
.taskExecutor(webSocketInboundThreadPool);
}
/**
* 允许跨域访问
*/
@Override
protected boolean sameOriginDisabled() {
return true;
}
@Override
<