> 技术文档 > Spring Boot WebSocket 配置与 404 错误解决方案_html页 websocket 连接跨越 无法连接 springboot

Spring Boot WebSocket 配置与 404 错误解决方案_html页 websocket 连接跨越 无法连接 springboot


完整的 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@EnableWebSocketpublic 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@EnableWebSocketpublic class WebSocketConfig implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(myHandler(), \"/my-websocket\") .setAllowedOrigins(\"*\"); // 允许所有来源 } // ... 其他配置}

4. 上下文路径问题

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

5. 安全配置拦截

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

@Configurationpublic 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 错误问题。如果问题仍然存在,建议检查网络代理设置、防火墙规则或应用服务器的特定配置。