WebSocket连接错误的解决方案

一、前言

使用websocket进行实时通信时,常见以下报错:

WebSocket connection to 'ws://localhost' failed:

或者

Whoops!Lost connection to http://localhost:

网上很多方案例如重新导入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
};

 

posted @ 2022-08-29 14:56  xiexie0812  阅读(3708)  评论(0编辑  收藏  举报