最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot集成WebSokcet代碼步驟

 更新時間:2026年01月16日 10:39:01   作者:盹貓  
Spring?Boot是一個流行的Java框架,用于快速構建Spring應用程序,WebSocket是一種實現(xiàn)實時通信的協(xié)議,與HTTP協(xié)議結合使用,可以提供全雙工通信,這篇文章主要介紹了SpringBoot集成WebSokcet代碼步驟

前言

在Web開發(fā)時,有時我們需要一些實時性比較高的數據反饋,如設備監(jiān)測、系統(tǒng)監(jiān)測、聊天等,這時使用HTTP顯然是不適合的,這時就需要用到WebSocket通過單次連接來獲取長時間的數據獲取。

什么是websocket?

WebSocket 是一種在單個 TCP 連接上實現(xiàn)全雙工(雙向)通信的網絡協(xié)議,由 HTML5 規(guī)范定義,旨在它允許客戶端(如瀏覽器)和服務器之間建立持久連接,雙方可以隨時向對方發(fā)送數據,而無需像 HTTP 那樣每次通信都重新建立連接。

本篇文章就是記錄SpringBoot如何集成WebSocket功能,廢話不多說,讓我們開始吧~

環(huán)境準備

因為要使用websocket,所以在除了集成基礎的spring-boot-starter-web 依賴以外,還要集成

spring-boot-starter-websocket 以獲得Websocket支持。

Pom.xml

<properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
        <!--Web依賴-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--WebSocket依賴-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
            <version>2.3.12.RELEASE</version>
        </dependency>
</dependencies>

代碼步驟

配置websocket節(jié)點

在配置類里,我們需要新建一個ServerEndpointExporter 并交給SpringBoot管理,即可開啟WebSocket節(jié)點功能,內容如下:

@Configuration
public class WebSocketConfig {
    /**
     * 注入ServerEndpointExporter,
     * 這個bean會自動注冊使用了@ServerEndpoint注解聲明的Websocket endpoint
     */
    @Bean
    public ServerEndpointExporter serverEndpointExporter() {
        return new ServerEndpointExporter();
    }
}

創(chuàng)建Websocket節(jié)點

首先需要在需使用到的WebSocket類上添加@ServerEndpoint(path,config) 以標記該類會作為一個websokcet的節(jié)點類,其中

  • path:該節(jié)點的訪問路徑
  • config: 可以做一些額外配置,如該節(jié)點的訪問權限校驗。

如下:

@Component
@Slf4j
@ServerEndpoint(value = "/detail", configurator = WebSocketAuthConfig.class)
public class DetailServer {}

下面就可以在該類中以事件標注的方式定義我們的方法,可以使用以下注解:

  • @OnOpen :在有新的連接接入時,觸發(fā)方法。
  • @OnMessage: 當有新的消息時,觸發(fā)方法。
  • @OnError:當發(fā)生錯誤時,觸發(fā)方法。
  • @OnClose:當連接斷開時,觸發(fā)方法。

例如下面的方法定義:

    @OnOpen
    public void onOpen(Session session) {
        //這里一般會存儲會話。
        log.info("【websocket消息】有新的連接");
    }

    /**
     * 鏈接關閉調用的方法
     */
    @OnClose
    public void onClose() {
        //這里會移除會話。
        log.info("【websocket消息】連接斷開");
    }

    @OnMessage
    public void onMessage(String message) {
        log.info("【websocket消息】收到客戶端消息:" + message);
    }

    @OnError
    public void onError(Session session, Throwable error) {
        log.error("用戶錯誤,原因:" + error.getMessage());
    }

一般會創(chuàng)建一個用于存儲當前當前Session的Map,用于會話的管理,并可以通過

session.getAsyncRemote().sendText(message);

將message數據發(fā)送到已連接的前端頁面。

授權驗證

當然不能允許所有人連接我們定義的WebSokcet節(jié)點,我們可以通過繼承ServerEndpointConfig.Configurator 來對節(jié)點進行配置,一般可以用于添加請求配置或進行授權認證,如下實現(xiàn)了一個Jwt的token驗證:

@Slf4j
public class WebSocketAuthConfig extends ServerEndpointConfig.Configurator {

    /**
     * DES:[攔截websocket的請求頭,并驗證]
     *
     * @param originHeaderValue 請求頭
     * @return boolean
     * @link [java.lang.String]
     */
    @Override
    public boolean checkOrigin(final String originHeaderValue) {
        final ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        try {
            assert servletRequestAttributes != null;
            /*
              此處使用反射的方式獲取對象,無法@AutoWiredW自動注入
             */
            final JwtUtil jwtUtil = SpringUtil.getBean(JwtUtil.class);
            HttpServletResponse response = servletRequestAttributes.getResponse();
            HttpServletRequest request = servletRequestAttributes.getRequest();
            //獲取并驗證請求參數中的token參數            
final String token = servletRequestAttributes.getRequest().getParameter("token");
            final Claims claims = jwtUtil.getClaimsByToken(token);
            if (ObjectUtil.isNull(claims)) {
                /*
                  Token驗證失敗,拒絕鏈接
                 */
                log.info("Token錯誤,拒絕連接......");
                request.getSession().setAttribute("loginFill",true);
                return  false;
            }else {
                request.getSession().setAttribute("loginFill",false);
            }
        } catch (final Exception e) {
            log.error("WebSocket-auth-error", e);
        }

        return true;
    }
}

當然這里也可以通過Shiro的根據路徑配置攔截請求,這里也是支持的,這樣ServerEndpointConfig.Configurator就可以不用單獨配置。

總結

通過上述方式,就可以建立一個比較完善的WebSocket節(jié)點,在實際開發(fā)過程中可以解決一些實時性要求較高的數據傳輸。當然,實現(xiàn)WebSocket并不只是有這一種方式,也可以通過Netty框架去自己實現(xiàn),這樣在高并發(fā)系統(tǒng)下的效率會更高。

到此這篇關于SpringBoot集成WebSokcet的文章就介紹到這了,更多相關SpringBoot集成WebSokcet內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java 客戶端操作 FastDFS 實現(xiàn)文件上傳下載替換刪除功能

    Java 客戶端操作 FastDFS 實現(xiàn)文件上傳下載替換刪除功能

    這篇文章主要介紹了Java 客戶端操作 FastDFS 實現(xiàn)文件上傳下載替換刪除功能,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • Elasticsearch查詢之Match Query示例詳解

    Elasticsearch查詢之Match Query示例詳解

    這篇文章主要為大家介紹了Elasticsearch查詢之Match查詢示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • 面試官問如何啟動Java?線程

    面試官問如何啟動Java?線程

    這篇文章主要介紹了面試官問如何啟動Java?線程,Java?的線程創(chuàng)建和啟動非常簡單,但如果問一個線程是怎么啟動起來的往往并不清楚,甚至不知道為什么啟動時是調用start(),而不是調用run()方法呢?下面我們就一起進入文章學習這個問題吧
    2021-12-12
  • 深入探究Java中的HashMap為什么會產生死循環(huán)

    深入探究Java中的HashMap為什么會產生死循環(huán)

    HashMap?死循環(huán)發(fā)生在?JDK?1.8?之前的版本中,這篇文章主要來和大家深入探究一下為什么Java中HashMap會產生死循環(huán),感興趣的小伙伴可以了解一下
    2023-05-05
  • 詳解Java編程中final,finalize,finally的區(qū)別

    詳解Java編程中final,finalize,finally的區(qū)別

    這篇文章主要介紹了詳解Java編程中final,finalize,finally的區(qū)別,這個在Java面試題中簡直是太常見了...需要的朋友可以參考下
    2015-11-11
  • Java?深入淺出解析面向對象之抽象類和接口

    Java?深入淺出解析面向對象之抽象類和接口

    本章具體介紹了抽象類和接口,整篇文章用目前流行的手機來舉例,圖解穿插代碼案例。?JAVA成仙路從基礎開始講,后續(xù)會講到JAVA高級,中間會穿插面試題和項目實戰(zhàn),希望能給大家?guī)韼椭?/div> 2022-03-03
  • Java Zip文件讀寫操作詳解

    Java Zip文件讀寫操作詳解

    這篇文章主要為大家詳細介紹了如何利用Java ZipInputstream、ZipOutputStream實現(xiàn)獲取每個文件中的內容與寫入內容,感興趣的可以動手嘗試一下
    2022-11-11
  • 2020年IntelliJ IDEA最新最詳細配置圖文教程詳解

    2020年IntelliJ IDEA最新最詳細配置圖文教程詳解

    這篇文章主要介紹了2020年IntelliJ IDEA最新最詳細配置圖文教程詳解,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • JVM生產環(huán)境調優(yōu)實戰(zhàn)案例講解

    JVM生產環(huán)境調優(yōu)實戰(zhàn)案例講解

    這篇文章主要介紹了JVM生產環(huán)境調優(yōu)實戰(zhàn),本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2025-04-04
  • springboot接入mq的方法示例

    springboot接入mq的方法示例

    本文主要介紹了springboot接入mq的方法示例,主要實現(xiàn)配置以及實現(xiàn)一個簡單的發(fā)送、接收消息的例子,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09

最新評論

湛江市| 深圳市| 鲁甸县| 民乐县| 郧西县| 化德县| 阳高县| 陇西县| 二连浩特市| 朝阳县| 天柱县| 罗田县| 香河县| 嘉禾县| 潞城市| 漯河市| 綦江县| 台东县| 武城县| 缙云县| 西林县| 贵阳市| 甘泉县| 巩留县| 黄冈市| 恩施市| 乌鲁木齐县| 南城县| 萨嘎县| 乌苏市| 左贡县| 慈溪市| 墨江| 葵青区| 且末县| 龙州县| 广东省| 遂宁市| 天长市| 甘谷县| 龙泉市|