国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

RuoYi-Cloud-Plus集成 WebSocket

這篇具有很好參考價值的文章主要介紹了RuoYi-Cloud-Plus集成 WebSocket。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

學(xué)習(xí)地址:https://blog.csdn.net/qq_43898141/article/details/123744468

  1. 添加websocket 依賴
 <!--添加websockert依賴-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-websocket</artifactId><exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </exclusion>
    </exclusions>
  1. 添加配置
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

@Configuration
    public class WebSocketConfig {

        @Bean
        public ServerEndpointExporter serverEndpointExporter() {
            return new ServerEndpointExporter();
        }
    }

  1. webSocket 代碼
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.ruoyi.common.core.config.systemConfig;
import com.ruoyi.common.core.utils.SpringUtils;
import com.ruoyi.common.redis.service.RedisService;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.io.Serializable;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;


@ServerEndpoint(value = "/websocket/{userName}")
@Component
public class WebSocketService implements Serializable {

    //concurrent包的線程安全Set,用來存放每個客戶端對應(yīng)的WebSocketServer對象。
    @JsonBackReference
    private static Map<String, WebSocketService> webSocketMap = new ConcurrentHashMap<>();

    /**
     * 與某個客戶端的連接會話,需要通過它來給客戶端發(fā)送數(shù)據(jù)
     */
    private Session session;
    /**
     * 接收userName
     */
    private String userName = "";

    /**
     * 連接建立成功調(diào)用的方法
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("userName") String userName) {
        this.session = session;
        this.userName = userName;
        webSocketMap.put(userName, this);
        System.err.println("----------------------------------------------------------------------------");
        System.err.println("用戶連接:" + userName + ":" + userName + ",當(dāng)前在線人數(shù)為:" + webSocketMap.size());
        sendMessage("來自后臺的反饋:連接成功");
        webSocketMap.forEach((k, v) -> System.err.println(k));
    }


    /**
     * 連接關(guān)閉調(diào)用的方法
     */
    @OnClose
    public void onClose(@PathParam("userName") String userName) {
        if (webSocketMap.containsKey(userName)) {
            webSocketMap.remove(userName);
        }
        System.err.println("----------------------------------------------------------------------------");
        System.err.println(userName + "用戶退出,當(dāng)前在線人數(shù)為:" + webSocketMap.size());
    }

    /**
     * 收到客戶端消息后調(diào)用的方法
     *
     * @param message 客戶端發(fā)送過來的消息
     */
    @OnMessage
    public void onMessage(String message, Session session) {
        System.err.println("收到用戶消息:" + userName + ",報(bào)文:" + message);
        //可以群發(fā)消息
        //消息保存到數(shù)據(jù)庫、redis
        if (message != null) System.err.println("");
    }

    /**
     * 連接失敗調(diào)用方法
     * @param session
     * @param error
     */
    @OnError
    public void onError(Session session, Throwable error) {
        System.err.println("用戶錯誤:" + this.userName + ",原因:" + error.getMessage());
        error.printStackTrace();
    }


    /**
     * 連接服務(wù)器成功后主動推送
     */
    public void sendMessage(String message) {
        try {
            session.getBasicRemote().sendText(message);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }



    /**
     * 向指定客戶端發(fā)送消息
     * <p>
     * // * @param userName
     * //* @param message
     */
    public static void sendMessage(String userName, String message) {
        try {
            WebSocketService webSocketService = webSocketMap.get(userName);
            if (webSocketService != null) {
                webSocketService.getSession().getBasicRemote().sendText(message);
            }
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException(e.getMessage());
        }
    }


  //下面方法根據(jù)自己情況 刪 留
    public Session getSession() {
        return session;
    }

    public void setSession(Session session) {
        this.session = session;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public static Map<String, WebSocketService> getWebSocketMap() {
        return webSocketMap;
    }

    public static void setWebSocketMap(Map<String, WebSocketService> webSocketMap) {
        WebSocketService.webSocketMap = webSocketMap;
    }

    public static void put(String key, WebSocketService data) {
        webSocketMap.put(key, data);
    }

    public static WebSocketService get(String key) {
        return webSocketMap.get(key);
    }

    public static void del(String key) {
        webSocketMap.remove(key);
    }

  1. 網(wǎng)管配置服務(wù)轉(zhuǎn)發(fā)
# websocket模塊
        #服務(wù)名稱
- id: ruoyi-chat-websocket
  #轉(zhuǎn)發(fā)的服務(wù)
  uri: lb:ws://ruoyi-chat
  #轉(zhuǎn)發(fā)設(shè)置
  predicates:
    - Path=/websocket/**
  #請求地址后一位,如:/socket/xxx/xx  去掉socket = /xxx/xx
  filters:
    - StripPrefix=1

網(wǎng)關(guān)配置

  1. 重要: 如果你的webSocket 沒有Token 也沒有任何認(rèn)證的話 需要開放白名單。

配置

 # 不校驗(yàn)白名單
  ignore:
    whites:
      - /code
      - /auth/logout
      - /auth/login
      - /auth/smsLogin
      - /auth/xcxLogin
      - /auth/mobileLogin
      - /websocket/**
  1. **開始測試 **http://www.jsons.cn/websocket/

image.png

  1. 如果出現(xiàn)連接成功 立馬斷開的問題 排查思路如下
    1. 排查網(wǎng)關(guān)里面的轉(zhuǎn)發(fā)url 是否使用的ws=> lb:ws://ruoyi-chat
    2. 是否開啟了白名單

如果以上都可以了 還是不行,那就是因?yàn)樗淖幽K默認(rèn)也是需要Token 權(quán)限的 我在解決了兩天的情況下發(fā)現(xiàn) 需要加上以下配置

  1. 在 SecurityConfiguration implements WebMvcConfigurer 文件下面增加 放過
/**
* 校驗(yàn)是否從網(wǎng)關(guān)轉(zhuǎn)發(fā)
*/
@Bean
    public SaServletFilter getSaServletFilter() {
    return new SaServletFilter()
        .addInclude("/**")
        .addExclude("/actuator/**")
        .addExclude("/socket/**")
        .setAuth(obj -> SaIdUtil.checkCurrentRequestToken())
        .setError(e -> SaResult.error("認(rèn)證失敗,無法訪問系統(tǒng)資源").setCode(HttpStatus.UNAUTHORIZED));
}

出現(xiàn)的錯誤提示

WebSocketClientHandshakeException Create breakpoint : Invalid handshake response getStatus: 200 OK

An exception has been observed post termination, use DEBUG level to see the full stack:io.netty . handler . codec . http . websocketx . webSocketClientHandshakeExcept ion: Connection prematurely closed BEFORE opening handshake is complete.

結(jié)論:

在子模塊中也是需要鑒權(quán)的Token 的如果只在網(wǎng)管放開白名單 在子模塊也是不行的 所以直接在這個地方加上文章來源地址http://www.zghlxwxcb.cn/news/detail-425282.html

import cn.dev33.satoken.filter.SaServletFilter;
import cn.dev33.satoken.id.SaIdUtil;
import cn.dev33.satoken.interceptor.SaAnnotationInterceptor;
import cn.dev33.satoken.util.SaResult;
import com.yawei.common.core.constant.HttpStatus;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * 權(quán)限安全配置
 *
 * @author Suiquantong
 */
@AutoConfiguration
public class SecurityConfiguration implements WebMvcConfigurer {

    /**
     * 注冊sa-token的攔截器
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注解攔截器
        registry.addInterceptor(new SaAnnotationInterceptor()).addPathPatterns("/**");
    }

    /**
     * 校驗(yàn)是否從網(wǎng)關(guān)轉(zhuǎn)發(fā)
     */
    @Bean
    public SaServletFilter getSaServletFilter() {
        return new SaServletFilter()
            .addInclude("/**")
            .addExclude("/actuator/**")
            .addExclude("/socket/**")
            .setAuth(obj -> SaIdUtil.checkCurrentRequestToken())
            .setError(e -> SaResult.error("認(rèn)證失敗,無法訪問系統(tǒng)資源").setCode(HttpStatus.UNAUTHORIZED));
    }

}

到了這里,關(guān)于RuoYi-Cloud-Plus集成 WebSocket的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 重寫RuoYi-Cloud所有功能 整合 SpringCloudAlibaba Dubbo Mybatis-Plus MQ OSS ES Xxl-Job Docker 全方位升級 定期同步

    轉(zhuǎn)載于:https://blog.csdn.net/weixin_40461281/article/details/122837923 RuoYi-Cloud-Plus? 微服務(wù)通用權(quán)限管理系統(tǒng) ?重寫 RuoYi-Cloud 全方位升級(不兼容原框架) 系統(tǒng)演示:?傳送門?分布式集群版本(功能一致) 功能介紹 使用技術(shù) 文檔地址 特性注意事項(xiàng) 微服務(wù)權(quán)限管理系統(tǒng) RuoYi-Cloud-Plus RuoYi-Clo

    2024年02月08日
    瀏覽(23)
  • ruoyi-cloud部署

    ruoyi-cloud部署

    默認(rèn)你已經(jīng)安裝mysql,nacos,seata,sentinel等(沒有的可以先找教程安裝) 1、下載源碼:git clone https://gitee.com/zhangmrit/ruoyi-cloud 2、項(xiàng)目依賴導(dǎo)入,選擇自己的maven環(huán)境等,創(chuàng)建三個庫ry-cloud、ry-config、ry-seata執(zhí)行下面三個sql,把quartz放到ry-cloud 3、nacos配置,生成配置列表(配置該

    2024年02月11日
    瀏覽(22)
  • RuoYi-Vue-Plus搭建(若依)

    RuoYi-Vue-Plus搭建(若依)

    ?項(xiàng)目簡介 業(yè)務(wù)功能 拉取代碼 建庫建表 修改配置 后端啟動 前端啟動 項(xiàng)目訪問(http://localhost:81) ?? ? ? ?

    2024年02月11日
    瀏覽(25)
  • RuoYi-Flowable-Plus搭建(若依)

    RuoYi-Flowable-Plus搭建(若依)

    項(xiàng)目簡介 業(yè)務(wù)功能 拉取代碼 建庫建表 修改配置 后端啟動 前端啟動 項(xiàng)目訪問(http://localhost:81) ?? ? 測試SQL

    2024年02月16日
    瀏覽(20)
  • RuoYi -Cloud開源框架-跨域配置

    ??博主介紹:小黃鴨技術(shù) ??擅長領(lǐng)域:Java、實(shí)用工具、運(yùn)維 ?? 系列專欄:??開發(fā)工具?Java之路?八股文之路 ??如果文章寫作時有錯誤的地方,請各位大佬指正,一起進(jìn)步?。。???歡迎大家點(diǎn)贊?收藏??評論??支持博主???? 目錄 ?什么是跨域 RoYi-Cloud如何解決跨域

    2024年02月03日
    瀏覽(16)
  • RuoYi-Cloud微服務(wù)開發(fā)實(shí)戰(zhàn)

    RuoYi-Cloud微服務(wù)開發(fā)實(shí)戰(zhàn)

    目錄 第一章 開發(fā)環(huán)境搭建 前言 一、RuoYi-Cloud是什么? 二、環(huán)境部署 1.安裝JDK 2.安裝docker 3.下載mysql鏡像 4.下載redis鏡像 5.下載nacos-server?鏡像 6.安裝node.js 三、項(xiàng)目啟動 開發(fā)設(shè)備: ????????MacBook Pro(14英寸,2021年) ????????系統(tǒng)版本:macOS Monterey ????????芯片:

    2024年02月16日
    瀏覽(22)
  • ruoyi-cloud—若依微服務(wù)打包部署

    ruoyi-cloud—若依微服務(wù)打包部署

    1. 前端端口修改 2.?后端端口修改 (1)修改ruoyi-gateway服務(wù)中的bootstrap.yml的port端口 ?(2)修改ruoyi-ui中的vue.confing.js的target中的端口 3. 后端部署 (1) 在本地電腦上代碼界面上打包后端 在 ruoyi 項(xiàng)目的 bin 目錄下執(zhí)行 package.bat 打包Web工程,生成jar包文件。不同模塊版本會生成在

    2024年01月21日
    瀏覽(21)
  • ruoyi-cloud微服務(wù)新建子模塊

    ruoyi-cloud微服務(wù)新建子模塊

    相關(guān)文章 官方文檔 1、復(fù)制system模塊 直接復(fù)制 modules下面已有的system模塊,改名為 test 2、在modules下的 pom.xml文件中添加子模塊 test 這里要注意添加的位置是在 modules下的 pom.xml,也就是 test的父模塊的 3、進(jìn)入 test模塊修改 pom.xml 把原有的system 修改成test,把 modules-system修改成

    2024年02月13日
    瀏覽(19)
  • 若依微服務(wù)版啟動(RuoYi-Cloud)教程

    若依微服務(wù)版啟動(RuoYi-Cloud)教程

    之前一直有小伙伴咨詢?nèi)粢牢⒎?wù)版如何在本地啟動,今天簡單的給大家介紹一下。 首先,學(xué)習(xí)Java的小伙伴應(yīng)該對若依框架都應(yīng)該有所了解,RuoYi-Cloud 是一個 Java EE 分布式 微服務(wù)架構(gòu)平臺,基于經(jīng)典技術(shù)組合(Spring Boot、Spring Cloud Alibaba、Vue、Element),內(nèi)置模塊如:部門管

    2024年01月18日
    瀏覽(25)
  • 基于RuoYi-Flowable-Plus的若依ruoyi-nbcio支持自定義業(yè)務(wù)表單流程(二)

    基于RuoYi-Flowable-Plus的若依ruoyi-nbcio支持自定義業(yè)務(wù)表單流程(二)

    更多ruoyi-nbcio功能請看演示系統(tǒng) gitee源代碼地址 前后端代碼:?https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后臺管理系統(tǒng) ? ? ?之前講到了流程保存的時候還要看是否是自定義業(yè)務(wù)流程應(yīng)用類型,若是保存的時候不再檢查是否有關(guān)聯(lián)表單。?? ? ? 那接下來就需要一個自

    2024年02月07日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包