Spring Boot WebSocket 配置与 404 错误解决方案

完整的 WebSocket 配置实现

1. Maven 依赖配置

确保您的 pom.xml 文件中包含正确的 WebSocket 依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

2. WebSocket 端点实现

@Component
@ServerEndpoint(value = "/message")
public class WebSocketEndpoint {
    private static final Logger logger = LoggerFactory.getLogger(WebSocketEndpoint.class);

    @OnOpen
    public void onOpen(Session session) {
        logger.info("WebSocket连接建立: " + session.getId());
    }

    @OnMessage
    public void onMessage(String message, Session session) {
        logger.info("收到消息: " + message);
        session.getAsyncRemote().sendText("Echo: " + message);
    }

    @OnClose
    public void onClose(Session session) {
        logger.info("WebSocket连接关闭: " + session.getId());
    }

    @OnError
    public void onError(Session session, Throwable error) {
        logger.error("WebSocket发生错误: " + session.getId(), error);
    }
}

3. WebSocket 配置类

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        // 如果需要使用Spring的WebSocketHandler而不是JSR-356注解方式
        // registry.addHandler(myHandler(), "/my-websocket")
        //         .setAllowedOrigins("*");
    }

    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }

    // 如果使用WebSocketHandler方式
    // @Bean
    // public WebSocketHandler myHandler() {
    //     return new MyWebSocketHandler();
    // }
}

解决 404 错误的常见方案

当您遇到 “Unexpected server response: 404” 错误时,可能是以下原因导致的:

1. 端点路径不正确

确保客户端连接的 WebSocket URL 与服务器端配置一致:

  • 正确的 WebSocket URL 格式:ws://your-domain.com/messagewss://your-domain.com/message(安全连接)
  • 如果应用有上下文路径,需要包含:ws://your-domain.com/context-path/message

2. 缺少 ServerEndpointExporter

确保配置类中声明了 ServerEndpointExporter Bean,它负责注册 @ServerEndpoint 注解的类。

3. CORS 问题

如果前端和后端不在同一域名下,需要处理跨域问题:

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
    
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(myHandler(), "/my-websocket")
                .setAllowedOrigins("*");  // 允许所有来源
    }
    
    // ... 其他配置
}

4. 上下文路径问题

如果应用部署时有上下文路径(如 /app),需要确保客户端连接的是完整路径。

5. 安全配置拦截

检查 Spring Security 配置是否拦截了 WebSocket 路径:

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/message").permitAll()  // 允许WebSocket端点
            // 其他配置...
    }
}

客户端连接示例

HTML/JavaScript 客户端连接示例:

<script>
    const socket = new WebSocket('ws://' + window.location.host + '/message');
    
    socket.onopen = function(e) {
        console.log('连接建立');
        socket.send('Hello Server!');
    };
    
    socket.onmessage = function(event) {
        console.log('收到消息: ' + event.data);
    };
    
    socket.onclose = function(event) {
        console.log('连接关闭');
    };
    
    socket.onerror = function(error) {
        console.error('WebSocket错误: ' + error.message);
    };
</script>

测试与验证

  1. 启动 Spring Boot 应用
  2. 打开浏览器控制台,检查 WebSocket 连接是否成功建立
  3. 使用工具如 Postman 或 WebSocket 客户端测试连接
  4. 检查服务器日志是否有错误信息

通过以上完整配置和解决方案,您应该能够解决 WebSocket 连接时的 404 错误问题。如果问题仍然存在,建议检查网络代理设置、防火墙规则或应用服务器的特定配置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hi星尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值