亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Spring WebSocket 404錯(cuò)誤的解決方法

 更新時(shí)間:2017年12月10日 09:54:11   作者:Silent_Paladin  
這篇文章主要為大家詳細(xì)介紹了Spring WebSocket 404錯(cuò)誤的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

近來學(xué)習(xí) Spring WebSocket 時(shí)按照 Spring IN ACTION 中示例編寫代碼,運(yùn)行時(shí)瀏覽器報(bào)404 錯(cuò)誤

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

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

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 代碼發(fā)起連接請求及后續(xù)消息交互

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!');
}

部署后打開瀏覽器運(yùn)行,直接報(bào) 404 錯(cuò)誤

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

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

WebSocket 實(shí)質(zhì)上借用 HTTP 請求進(jìn)行握手,啟用 Spring WebSocket 需要在 org.springframework.web.servlet.DispatcherServlet 里配置攔截此請求。

以下是解決步驟:

首先,修改 WebSocketConfig 類定義,在類上添加 @Configuration 注解,表明該類以 JavaConfig 形式用作 bean 定義的源(相當(dāng)于 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 個(gè)方法:
- getRootConfigClasses – 返回帶有 @Configuration 注解的類將會用來配置 ContextLoaderListener 創(chuàng)建的應(yīng)用上下文中的 bean
- getServletConfigClasses – 返回帶有 @Configuration 注解的類將會用來定義 DispatcherServlet 應(yīng)用上下文中的 bean
- getServletMappings – 將一個(gè)或多個(gè)路徑映射到 DispatcherServlet 上

實(shí)際上,如果只需要 Spring WebSocket 生效,則只需要在 getServletConfigClasses 方法中返回用來定義 DispatcherServlet 應(yīng)用上下文中的 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[] {"/"};
 }

}

重新部署后代開瀏覽器運(yùn)行成功

客戶端消息

服務(wù)器消息

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java微信公眾平臺開發(fā)(1) 接入微信公眾平臺

    Java微信公眾平臺開發(fā)(1) 接入微信公眾平臺

    這篇文章主要為大家詳細(xì)介紹了Java微信公眾平臺開發(fā)第一步,接入微信公眾平臺,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • java實(shí)現(xiàn)同步回調(diào)的示例代碼

    java實(shí)現(xiàn)同步回調(diào)的示例代碼

    同步回調(diào)是一種在調(diào)用代碼中同步執(zhí)行回調(diào)函數(shù)的編程模式,在Java中,通過定義和實(shí)現(xiàn)接口來構(gòu)建同步回調(diào),本文就來介紹一下如何實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-09-09
  • java隨機(jī)生成8位數(shù)授權(quán)碼的實(shí)例

    java隨機(jī)生成8位數(shù)授權(quán)碼的實(shí)例

    下面小編就為大家?guī)硪黄猨ava隨機(jī)生成8位數(shù)授權(quán)碼的實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-02-02
  • Java 進(jìn)制轉(zhuǎn)換的方法

    Java 進(jìn)制轉(zhuǎn)換的方法

    這篇文章介紹了Java 進(jìn)制轉(zhuǎn)換的方法,有需要的朋友可以參考一下
    2013-09-09
  • Spring與MyBatis集成?AOP整合PageHelper插件的操作過程

    Spring與MyBatis集成?AOP整合PageHelper插件的操作過程

    Spring與MyBatis集成的主要目的是為了提供更強(qiáng)大的數(shù)據(jù)訪問和事務(wù)管理能力,以及簡化配置和提高開發(fā)效率,這篇文章主要介紹了Spring與MyBatis集成AOP整合PageHelper插件,需要的朋友可以參考下
    2023-08-08
  • idea中打開項(xiàng)目時(shí)import project和open區(qū)別詳解

    idea中打開項(xiàng)目時(shí)import project和open區(qū)別詳解

    本文主要介紹了idea中打開項(xiàng)目時(shí)import project和open區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Rabbitmq中的channel接口常用方法詳解

    Rabbitmq中的channel接口常用方法詳解

    這篇文章主要介紹了Rabbitmq中的channel接口常用方法詳解,為了確保消息一定被消費(fèi)者處理,rabbitMQ提供了消息確認(rèn)功能,就是在消費(fèi)者處理完任務(wù)之后,就給服務(wù)器一個(gè)回饋,服務(wù)器就會將該消息刪除,需要的朋友可以參考下
    2023-09-09
  • IDEA插件之快速刪除Java代碼中的注釋

    IDEA插件之快速刪除Java代碼中的注釋

    這篇文章主要介紹了IDEA插件之快速刪除Java代碼中的注釋,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • 詳解spring cloud分布式整合zipkin的鏈路跟蹤

    詳解spring cloud分布式整合zipkin的鏈路跟蹤

    這篇文章主要介紹了詳解spring cloud分布式整合zipkin的鏈路跟蹤,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-07-07
  • java中ThreadLocal的基本原理

    java中ThreadLocal的基本原理

    本文講解了java中ThreadLocal的一些基本原理,文中關(guān)于ThreadLocal的原理講解的非常詳細(xì),感興趣的朋友一起看看吧
    2021-08-08

最新評論