springmvc-websocket 403 错误

错误信息:

 WebSocket connection to 'ws://192.168.1.159:8080/websocket' failed: Error during WebSocket handshake: Unexpected response code: 403
WebSocketServerConfig.java
@EnableWebMvc
@Configuration
@EnableWebSocket
public class WebSocketServerConfig implements WebSocketConfigurer{
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        // 添加拦截地址以及相应的websocket消息处理器
        registry.addHandler(new MySocketHandler(), "/websocket")
                .addInterceptors(new MyHandshakeInterceptor())
                .setAllowedOrigins("*");

        registry.addHandler(new MySocketHandler(), "/sockJs")
                .addInterceptors(new MyHandshakeInterceptor())
                .setAllowedOrigins("*")
                .withSockJS();
    }
}

这里setAllowedOrigins设置为*依然报403,

springmvc.xml 配置websocket的allowed-origins="*" 问题解决

<bean id="websocket" class="com.mvc.wt.handler.WebsocketEndPoint" />
<websocket:handlers  allowed-origins="*">
    <websocket:mapping path="/websocket" handler="websocket" />
    <websocket:handshake-interceptors>
        <bean class="com.mvc.wt.handler.MyHandshakeInterceptor" />
    </websocket:handshake-interceptors>
</websocket:handlers>

注:spring版本必须4.0.0以上,tomca版本8.5.8

今天在学习springmvc整合websocket时遇到的错误,记录一下,便于后期遇到能快速处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SpringMVC整合WebSocket可以通过以下步骤实现: 1. 添加WebSocket依赖 在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>org.springframework</groupId> <artifactId>spring-websocket</artifactId> <version>5.3.9</version> </dependency> ``` 2. 配置WebSocketSpringMVC配置文件中添加以下配置: ``` @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(new MyWebSocketHandler(), "/my-websocket"); } } ``` 其中,MyWebSocketHandler是自定义的WebSocket处理器,"/my-websocket"是WebSocket的访问路径。 3. 编写WebSocket处理器 自定义的WebSocket处理器需要实现WebSocketHandler接口,例如: ``` public class MyWebSocketHandler implements WebSocketHandler { @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { // 连接建立后的处理逻辑 } @Override public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception { // 处理收到的消息 } @Override public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { // 处理传输错误 } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception { // 连接关闭后的处理逻辑 } @Override public boolean supportsPartialMessages() { return false; } } ``` 4. 编写WebSocket客户端 可以使用JavaScript或其他语言编写WebSocket客户端,例如: ``` var socket = new WebSocket("ws://localhost:8080/my-websocket"); socket.onopen = function() { // 连接建立后的处理逻辑 }; socket.onmessage = function(event) { // 处理收到的消息 }; socket.onclose = function(event) { // 连接关闭后的处理逻辑 }; ``` 以上就是SpringMVC整合WebSocket的基本步骤。 ### 回答2: Spring MVC 是一个基于 Java 的 Web 框架,可以将 WebSocket 整合到 Spring MVC 中,实现实时通信的功能。下面详细介绍 Spring MVC 整合 WebSocket 的步骤: 1. 配置 Maven 依赖:在 pom.xml 文件中添加以下依赖: ``` <dependency> <groupId>org.springframework</groupId> <artifactId>spring-websocket</artifactId> <version>4.3.13.RELEASE</version> </dependency> ``` 2. 配置 WebSocket 消息处理器:创建一个类来处理 WebSocket 消息。该类需要实现 `WebSocketHandler` 接口,实现处理 WebSocket 消息的方法。 ``` public class MyWebSocketHandler implements WebSocketHandler { @Override public void afterConnectionEstablished(WebSocketSession session) throws Exception { // WebSocket 连接建立时执行的操作 } @Override public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception { // 处理收到的 WebSocket 消息 } @Override public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { // 处理 WebSocket 消息传输过程中出现的异常 } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception { // WebSocket 连接关闭时执行的操作 } @Override public boolean supportsPartialMessages() { return false; } } ``` 3. 配置 Spring MVC WebSocket 拦截器:创建一个类,实现 `HandshakeInterceptor` 接口。该拦截器可在 WebSocket 握手阶段执行特定的操作,例如在 WebSocket 握手时将用户信息添加到 session 中。 ``` public class MyWebSocketInterceptor implements HandshakeInterceptor { @Override public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception { // 在 WebSocket 握手之前执行的操作 return true; } @Override public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, @Nullable Exception exception) { // 当 WebSocket 握手成功时执行的操作 } } ``` 4. 配置 Spring MVC WebSocket:在 Spring MVC 配置文件中配置 WebSocket 服务。可以使用 `WebSocketHandlerRegistry` 注册 WebSocket 消息处理器,也可以使用 `HandshakeInterceptorRegistry` 注册 WebSocket 拦截器。 ``` @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { @Autowired private MyWebSocketHandler myWebSocketHandler; @Autowired private MyWebSocketInterceptor myWebSocketInterceptor; @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(myWebSocketHandler, "/myWebSocket") .addInterceptors(myWebSocketInterceptor) .setAllowedOrigins("*"); } } ``` 5. 创建 WebSocket 客户端:在客户端中可以使用 JavaScript 代码调用 WebSocket 服务。使用 `var ws = new WebSocket("ws://localhost:8080/myWebSocket");` 创建 WebSocket 连接,然后可以监听 `ws.onopen`、`ws.onerror`、`ws.onmessage` 和 `ws.onclose` 等事件,并在这些事件发生时执行相应的操作。 总结来说,Spring MVC 整合 WebSocket 的步骤包括配置 Maven 依赖、配置 WebSocket 消息处理器、配置 WebSocket 拦截器、配置 Spring MVC WebSocket 和创建 WebSocket 客户端等。使用 Spring MVC 整合 WebSocket 可以使得在 Web 应用中实现实时通信变得更加简单和方便。 ### 回答3: Spring MVC 是一个基于 MVC(Model-View-Controller) 模式的 WEB 应用程序开发框架,而 WebSocket 是 HTML5 提出的基于 TCP 协议的全双工通讯技术,它可以让浏览器与服务器进行实时的双向数据传输。为了实现 Websocket 和 Spring MVC 的整合,我们需要通过以下步骤: 1. 添加 Spring WebSocket 依赖 首先在 Maven 或 Gradle 项目的 `pom.xml` 或 `build.gradle` 文件中添加 Spring WebSocket 的依赖,如果是手动添加 jar 包,则需要添加 `spring-websocket.jar` 和 `javax-websocket-client-api.jar` ,并且需要确保其版本和 Spring 的版本匹配。 2. 配置 WebSocket 处理器 接下来我们需要为 WebSocket 客户端和服务端分别配置其处理器。 在服务端,我们需要创建一个类来处理 WebSocket 连接请求,该类需要继承 `WebSocketHandler` 接口并实现其中的 `handleMessage`、`handleTransportError` 和 `afterConnectionClosed` 方法。 然后将这个类注册到 `WebSocketHandlerRegistry` 中,代码如下: ``` @Configuration @EnableWebSocket public class WebSocketConfig implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { registry.addHandler(new MyWebSocketHandler(), "/myHandler").setAllowedOrigins("*"); } } public class MyWebSocketHandler extends TextWebSocketHandler { @Override public void handleTextMessage(WebSocketSession session, TextMessage message) throws IOException { // 处理收到的消息 } @Override public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { // 处理传输错误 } @Override public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception { // 处理关闭连接事件 } } ``` 在上述代码中,我们创建了一个 `WebSocketConfig` 配置类,并使用 `@EnableWebSocket` 注解开启 WebSocket 支持。 然后在 `registerWebSocketHandlers` 方法中,我们注册了一个 `MyWebSocketHandler` 处理器,并为其指定了路径 `"/myHandler"`。需要注意的是,我们使用 `setAllowedOrigins("*")` 方法指定了跨域访问的规则。 3. 在客户端发起连接 客户端连接 WebSocket 时需要通过标准的 WebSocket API 建立连接。这里我们以 JavaScript 代码为例: ``` var ws = new WebSocket("ws://localhost:8080/myHandler"); ws.onopen = function() { console.log("连接成功"); }; ws.onmessage = function(event) { console.log("收到消息:" + event.data); } ws.onclose = function() { console.log("连接关闭"); } ``` 在上述代码中,我们首先创建了一个 WebSocket 对象,并指定连接的 URL 为 `ws://localhost:8080/myHandler`。然后通过 `onopen`、`onmessage` 和 `onclose` 等事件监听器来处理连接成功、接收消息和连接关闭事件。 通过以上步骤,我们就完成了 WebSocket 和 Spring MVC 的整合。在实际的应用中,我们可以根据自己的需要来进一步扩展和优化代码,以达到更好的性能和用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值