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/message
或wss://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>
测试与验证
- 启动 Spring Boot 应用
- 打开浏览器控制台,检查 WebSocket 连接是否成功建立
- 使用工具如 Postman 或 WebSocket 客户端测试连接
- 检查服务器日志是否有错误信息
通过以上完整配置和解决方案,您应该能够解决 WebSocket 连接时的 404 错误问题。如果问题仍然存在,建议检查网络代理设置、防火墙规则或应用服务器的特定配置。