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

SpringBoot集成WebSokcet代碼步驟

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

前言

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

什么是websocket?

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

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

環(huán)境準(zhǔn)備

因?yàn)橐褂脀ebsocket,所以在除了集成基礎(chǔ)的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é)點(diǎn)

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

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

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

首先需要在需使用到的WebSocket類上添加@ServerEndpoint(path,config) 以標(biāo)記該類會(huì)作為一個(gè)websokcet的節(jié)點(diǎn)類,其中

  • path:該節(jié)點(diǎn)的訪問(wèn)路徑
  • config: 可以做一些額外配置,如該節(jié)點(diǎn)的訪問(wèn)權(quán)限校驗(yàn)。

如下:

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

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

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

例如下面的方法定義:

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

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

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

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

一般會(huì)創(chuàng)建一個(gè)用于存儲(chǔ)當(dāng)前當(dāng)前Session的Map,用于會(huì)話的管理,并可以通過(guò)

session.getAsyncRemote().sendText(message);

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

授權(quán)驗(yàn)證

當(dāng)然不能允許所有人連接我們定義的WebSokcet節(jié)點(diǎn),我們可以通過(guò)繼承ServerEndpointConfig.Configurator 來(lái)對(duì)節(jié)點(diǎn)進(jìn)行配置,一般可以用于添加請(qǐng)求配置或進(jìn)行授權(quán)認(rèn)證,如下實(shí)現(xiàn)了一個(gè)Jwt的token驗(yàn)證:

@Slf4j
public class WebSocketAuthConfig extends ServerEndpointConfig.Configurator {

    /**
     * DES:[攔截websocket的請(qǐng)求頭,并驗(yàn)證]
     *
     * @param originHeaderValue 請(qǐng)求頭
     * @return boolean
     * @link [java.lang.String]
     */
    @Override
    public boolean checkOrigin(final String originHeaderValue) {
        final ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        try {
            assert servletRequestAttributes != null;
            /*
              此處使用反射的方式獲取對(duì)象,無(wú)法@AutoWiredW自動(dòng)注入
             */
            final JwtUtil jwtUtil = SpringUtil.getBean(JwtUtil.class);
            HttpServletResponse response = servletRequestAttributes.getResponse();
            HttpServletRequest request = servletRequestAttributes.getRequest();
            //獲取并驗(yàn)證請(qǐng)求參數(shù)中的token參數(shù)            
final String token = servletRequestAttributes.getRequest().getParameter("token");
            final Claims claims = jwtUtil.getClaimsByToken(token);
            if (ObjectUtil.isNull(claims)) {
                /*
                  Token驗(yàn)證失敗,拒絕鏈接
                 */
                log.info("Token錯(cuò)誤,拒絕連接......");
                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;
    }
}

當(dāng)然這里也可以通過(guò)Shiro的根據(jù)路徑配置攔截請(qǐng)求,這里也是支持的,這樣ServerEndpointConfig.Configurator就可以不用單獨(dú)配置。

總結(jié)

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

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

相關(guān)文章

  • Java Zip文件讀寫操作詳解

    Java Zip文件讀寫操作詳解

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

    2020年IntelliJ IDEA最新最詳細(xì)配置圖文教程詳解

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

    JVM生產(chǎn)環(huán)境調(diào)優(yōu)實(shí)戰(zhàn)案例講解

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

    springboot接入mq的方法示例

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

    乌审旗| 南丰县| 泸溪县| 东乡族自治县| 志丹县| 伊川县| 汝南县| 通辽市| 灵丘县| 云霄县| 法库县| 浦城县| 科技| 罗平县| 钟山县| 枣阳市| 太和县| 阜平县| 房产| 乡城县| 平湖市| 保山市| 诸暨市| 拉孜县| 大理市| 阳江市| 焦作市| 章丘市| 申扎县| 桃源县| 冀州市| 桐柏县| 望奎县| 武冈市| 皋兰县| 怀仁县| 隆回县| 区。| 武鸣县| 承德市| 穆棱市|