91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring WebSocket 404錯誤的解決方法

發布時間:2020-10-23 08:00:37 來源:腳本之家 閱讀:460 作者:Silent_Paladin 欄目:編程語言

近來學習 Spring WebSocket 時按照 Spring IN ACTION 中示例編寫代碼,運行時瀏覽器報404 錯誤

WebSocket connection to 'ws://localhost/websocket/marco' failed: Error during WebSocket handshake: Unexpected response code: 404

Spring WebSocket 404錯誤的解決方法

按照 Spring IN ACTION 中步驟:
首先,繼承 AbstractWebSocketHandler,重載以下 3 個方法:
- handleTextMessage – 處理文本類型消息
- afterConnectionEstablished – 新連接建立后調用
- afterConnectionClosed – 連接關閉后調用

import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.AbstractWebSocketHandler;

public class MarcoHandler extends AbstractWebSocketHandler {

 protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
  System.out.println("Received message: " + message.getPayload());
  Thread.sleep(2000);
  session.sendMessage(new TextMessage("Polo!"));
 }

 @Override
 public void afterConnectionEstablished(WebSocketSession session) {
  System.out.println("Connection established!");
 }

 @Override
 public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {
  System.out.println("Connection closed. Status: " + status);
 }

}

其次,使用 JavaConfig 啟用 WebSocket 并映射消息處理器

import org.springframework.context.annotation.Bean;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;

@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

 @Override
 public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
  registry.addHandler(marcoHandler(), "/marco");
 }

 @Bean
 public MarcoHandler marcoHandler() {
  return new MarcoHandler();
 }

}

最后,編寫前端 JS 代碼發起連接請求及后續消息交互

var url = 'ws://' + window.location.host + '/websocket/marco';
var sock = new WebSocket(url);

sock.onopen = function() {
 console.log('Opening');
 sock.send('Marco!');
};

sock.onmessage = function(e) {
 console.log('Received Message: ', e.data);
 setTimeout(function() {
  sayMarco()
 }, 2000);
};

sock.onclose = function() {
 console.log('Closing');
};

function sayMarco() {
 console.log('Sending Marco!');
 sock.send('Marco!');
}

部署后打開瀏覽器運行,直接報 404 錯誤

Spring WebSocket 404錯誤的解決方法

上網搜索了一晚上解決方案,包括參考 stackoverflow.com 上的經驗都未解決該問題,直到查看到以下文章:
Spring集成webSocket頁面訪問404問題的解決方法

在此自己也做個記錄避免以后遺忘。

WebSocket 實質上借用 HTTP 請求進行握手,啟用 Spring WebSocket 需要在 org.springframework.web.servlet.DispatcherServlet 里配置攔截此請求

以下是解決步驟:

首先,修改 WebSocketConfig 類定義,在類上添加 @Configuration 注解,表明該類以 JavaConfig 形式用作 bean 定義的源(相當于 XML 配置中的 <beans> 元素)。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

 @Override
 public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
  registry.addHandler(marcoHandler(), "/marco");
 }

 @Bean
 public MarcoHandler marcoHandler() {
  return new MarcoHandler();
 }

}

其次,使用 JavaConfig 配置 DispatcherServlet,繼承org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer ,重載以下 3 個方法:
- getRootConfigClasses – 返回帶有 @Configuration 注解的類將會用來配置 ContextLoaderListener 創建的應用上下文中的 bean
- getServletConfigClasses – 返回帶有 @Configuration 注解的類將會用來定義 DispatcherServlet 應用上下文中的 bean
- getServletMappings – 將一個或多個路徑映射到 DispatcherServlet 上

實際上,如果只需要 Spring WebSocket 生效,則只需要在 getServletConfigClasses 方法中返回用來定義 DispatcherServlet 應用上下文中的 bean

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class WebSocketInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

 @Override
 protected Class<?>[] getRootConfigClasses() {
  return null;
 }

 @Override
 protected Class<?>[] getServletConfigClasses() {
  return new Class<?>[] {WebSocketConfig.class};
 }

 @Override
 protected String[] getServletMappings() {
  return new String[] {"/"};
 }

}

重新部署后代開瀏覽器運行成功

客戶端消息

Spring WebSocket 404錯誤的解決方法

服務器消息

Spring WebSocket 404錯誤的解決方法

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阿合奇县| 濉溪县| 枣庄市| 临夏市| 大新县| 许昌市| 闸北区| 同德县| 夏津县| 大宁县| 福建省| 闻喜县| 南乐县| 加查县| 唐山市| 都昌县| 正安县| 邯郸县| 芜湖县| 恩施市| 四川省| 清水县| 陆良县| 平利县| 龙陵县| 石屏县| 忻城县| 嘉兴市| 长海县| 都安| 平安县| 比如县| 赤水市| 濮阳市| 怀集县| 阿巴嘎旗| 讷河市| 萨迦县| 鹤壁市| 夏河县| 乌审旗|