- WebSocket Handshake
@Configuration@EnableWebSocketpublic class WebSocketConfig implements WebSocketConfigurer {@Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {registry.addHandler(messageHandler(), "/message").setHandshakeHandler(handshakeHandler())// 添加捂手拦截器.addInterceptors(new HandshakeInterceptor() {// 如果该方法返回false,则不允许建立连接@Overridepublic boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response,WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {// todoattributes.put("uid", uid) ;return true ;}@Overridepublic void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler,Exception exception) {// todo}}) ;}}
- 部署
WebSocketHttpRequestHandler也很容易集成到其他HTTP处理场景中 。这样既方便又容易理解 。但是,对于JSR-356运行时,需要特别注意 。
JAVA WebSocket API (JSR-356)提供两种部署机制 。第一种方法涉及启动时的Servlet容器类路径扫描(Servlet 3特性)@ServerEndpoint 。另一个是Servlet容器初始化时使用的注册 API(ServletContAInerInitializer) 。这两种机制都不可能对所有HTTP处理使用单个“前端控制器” — 包括WebSocket握手和所有其他HTTP请求 — 如Spring MVC的DispatcherServlet 。
这是JSR-356的一个重要限制,Spring的WebSocket支持通过特定于服务器的RequestUpgradeStrategy实现来解决这个问题,即使运行在JSR-356运行时也是如此 。Tomcat、Jetty、GlassFish、WebLogic、WebSphere和Undertow(以及WildFly)目前都存在这样的策略 。
- 服务配置
对于Tomcat、WildFly和GlassFish,可以在WebSocket Java配置中添加
ServletServerContainerFactoryBean,如下面的例子所示:
@Beanpublic ServletServerContainerFactoryBean servletServerContainerFactoryBean() {ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean() ;container.setMaxTextMessageBufferSize(8192) ;container.setMaxBinaryMessageBufferSize(8192) ;return container ;}
- 允许的来源
三种可能的行为是:
- 仅允许同源请求(默认):在这种模式下,当启用SockJS时,Iframe HTTP响应头X-Frame-Options设置为SAMEORIGIN,并且禁用JSONP传输,因为它不允许检查请求的来源 。因此,启用此模式时,不支持IE6和IE7 。
- 允许指定的来源列表:每个允许的来源必须以http://或https://.开头在此模式下,当启用SockJS时,禁用IFrame传输 。因此,启用此模式时,将不支持IE6到IE9 。
- 允许所有来源:要启用此模式,你应该提供*作为允许的来源值 。在该模式下,所有传输通道都可用 。
@Configuration@EnableWebSocketpublic class WebSocketConfig implements WebSocketConfigurer {@Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {registry.addHandler(messageHandler(), "/message").setAllowedOriginPatterns("*") ;}}
测试通过上面的介绍和配置,WebSocket环境就算是简单的配置完成了,接下来通过Postman进行测试 。【SpringBoot整合WebSocket详解】
文章插图
图片
连接成功
文章插图
发送消息及接收消息
文章插图
推荐阅读
- 28个SpringBoot项目中常用注解,日常开发、求职面试不再懵圈
- SpringBoot中使用Cache提升接口性能详解
- 浅析 SpringBoot FatJar 机制的设计与实现
- 聊聊 Springboot 启动原理
- SpringBoot整合Mybatis-Plus多数据源
- SpringBoot自动装配原理
- Spring/SpringBoot中的声明式事务和编程式事务源码、区别、优缺点、适用场景、实战
- SpringBoot+Vue+ES 实现仿百度全文搜索
- SpringBoot整合RocketMQ,老鸟们都是这么玩的!
- 在 SpringBoot 中使用 Spring AOP 实现接口鉴权