package com.qianwen.core.websocket.config; import java.util.List; import javax.annotation.PostConstruct; import com.qianwen.core.websocket.custom.SubscriptionSessionFilter; import com.qianwen.core.websocket.handler.JsonMessageHandler; import com.qianwen.core.websocket.holder.JsonMessageFilterHolder; import com.qianwen.core.websocket.holder.JsonMessageHandlerHolder; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.web.socket.WebSocketHandler; import org.springframework.web.socket.config.annotation.EnableWebSocket; import org.springframework.web.socket.config.annotation.WebSocketConfigurer; import org.springframework.web.socket.server.HandshakeInterceptor; @Configuration @Import({WebSocketHandlerConfig.class}) @EnableWebSocket public class WebSocketAutoConfiguration { private final WebSocketProperties webSocketProperties; private final List jsonMessageHandlerList; private final List jsonMessageFilterList; public WebSocketAutoConfiguration(final WebSocketProperties webSocketProperties, final List jsonMessageHandlerList, final List jsonMessageFilterList) { this.webSocketProperties = webSocketProperties; this.jsonMessageHandlerList = jsonMessageHandlerList; this.jsonMessageFilterList = jsonMessageFilterList; } @ConditionalOnMissingBean @Bean public WebSocketConfigurer webSocketConfigurer(List handshakeInterceptor, WebSocketHandler webSocketHandler) { return registry -> { //普通websocket支持 registry.addHandler(webSocketHandler, new String[]{this.webSocketProperties.getPath()}).setAllowedOrigins(new String[]{this.webSocketProperties.getAllowOrigins()}).addInterceptors((HandshakeInterceptor[]) handshakeInterceptor.toArray(new HandshakeInterceptor[0])); //提供降级为SockJS的支持 registry.addHandler(webSocketHandler, new String[]{this.webSocketProperties.getSockJsPath()}).setAllowedOrigins(new String[]{this.webSocketProperties.getAllowOrigins()}).addInterceptors((HandshakeInterceptor[]) handshakeInterceptor.toArray(new HandshakeInterceptor[0])).withSockJS(); }; } @PostConstruct public void initJsonMessageHandlerHolder() { for (JsonMessageHandler jsonMessageHandler : this.jsonMessageHandlerList) { JsonMessageHandlerHolder.addHandler(jsonMessageHandler); } for (SubscriptionSessionFilter filter : this.jsonMessageFilterList) { JsonMessageFilterHolder.addFilter(filter); } } }