一、前言
使用websocket实时通信时,常见以下报错:
或者
许多在线方案例如重新导入fastjson依赖、缺乏证书等其他解决方案不能解决问题,以下是我的经验websocket多日折磨后总结出的错误原因及解决方案。
二、错误及其解决方案
1、使用ServerEndpointExporter但是外置没用tomcat容器
这个错误应该是最常见和最不容易发现的,因为它藏得太深了,博主被困了很多天才发现错误
ServerEndpointExporter需要外置tomcat我们通常使用容器运行环境SpringBoot内置tomcat,导致ServerEndpointExporter一直在运行中报错。
在pom.xml排除文件SpringBoot自带的嵌入tomcat,添加外置的tomcat依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <!-- 移除嵌入式tomcat插件 --> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <!--<scope>provided</scope>--> </dependency>
2、使用拦截器或过滤器但没有对请求放行
这个错误比上面更容易发现,但也很难定位这个错误
使用拦截器或过滤器,但没有放行请求,特别是使用Spring Security或Shiro,很容易忘记放行请求路径
请求路径在相应的配置文件中放行"/socket/**"为例
// API_PATH白名单 private static final String[] SECURITY_IGNORE_API_PATH = { "/admin/login", "/logout", "/socket/**" ///放行请求api };
/* 配置认证授权 */ http.authorizeRequests() .antMatchers(SECURITY_IGNORE_API_PATH).permitAll() // API白名单 .anyRequest() //任何其他请求 .authenticated(); //都需要身份认证