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