Springboot + Vue + WebSocket + Notification實現消息推送功能

實現功能

? ? ? ? 基于Springboot與Vue架構,首先使用Websocket實現頻道訂閱,在實現點對點與群發功能后,在前端調用windows自帶的消息通知,實現推送功能。

開發環境

  • Springboot 2.6.7
  • vue?2.6.11
  • socket-client?1.0.0

準備工作

在 Vue.js 項目中安裝sockjs-client和stompjs。

npm install sockjs-client stompjs

在后端項目中添加依賴。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

WebSocket

? ? ? ? ?為完成單播或者廣播的頻道的訂閱功能,需要在前端和后端完成WebSocket的基本配置。

前端配置

? ? ? ? 需在vue項目中新建websocket.js文件,主要完成:

? ? ? ? 1.獲取userid

? ? ? ? 2.定義WebSocketService,完成connect、subscribe、unsubscribe、sendMessage、disconnect等主要函數。

代碼如下所示。

websocket.js
import SockJS from 'sockjs-client';
import Stomp from 'stompjs';const userid = JSON.parse(sessionStorage.getItem('CurUser')).idclass WebSocketService {constructor() {this.stompClient = null;this.subscriptions = new Map(); // 存儲訂閱的頻道}// 連接 WebSocketconnect() {const socket = new SockJS("/api/broadcast"); // 后端地址this.stompClient = Stomp.over(socket);this.stompClient.connect({}, () => {console.log('do connect method');console.log('stompClient', this.stompClient)this.subscribe('/user/' + userid.toString() + '/alone/getResponse', (response) => {if (this.onGlobalNotification) {console.log("message print", response)// this.onGlobalNotification(JSON.parse(message.body));this.onGlobalNotification(response.body);}});});}// 訂閱頻道subscribe(destination, callback) {const subscription = this.stompClient.subscribe(destination, callback);this.subscriptions.set(destination, subscription);}// 取消訂閱unsubscribe(destination) {const subscription = this.subscriptions.get(destination);if (subscription) {subscription.unsubscribe();this.subscriptions.delete(destination);}}// 發送消息到后端sendMessage(destination, message) {console.log("sendMessage method , message is ", message.content)this.stompClient.send(destination, {}, message.content);}// 斷開連接disconnect() {if (this.stompClient) {this.stompClient.disconnect();console.log('WebSocket 斷開連接!');}}
}export default new WebSocketService();

后端配置

? ? ? ? 在后端同樣需要完成頻道的訂閱,新建文件WebSocketConfig.java,代碼如下所示。

package com.wms.common;import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;import javax.annotation.Resource;@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {@Resourcepublic AppConfig appConfig;@Overridepublic void configureMessageBroker(MessageBrokerRegistry registry) {registry.enableSimpleBroker("/user", "/topic1", "/topic2", "/mass");// 點對點使用的訂閱前綴(客戶端訂閱路徑上會體現出來),不設置的話,默認也是 /user/// 注意,這里必須和上面設置的Broker:/user 一致(兩個都可以自定義,但必須一致)。否則連接不上registry.setUserDestinationPrefix("/user/");// 指服務端接收地址的前綴,意思就是說客戶端給服務端發消息的地址的前綴}@Overridepublic void registerStompEndpoints(StompEndpointRegistry registry) {// 注冊一個STOMP的endpoint端點,并指定使用SockJS協議// 前端使用這個地址連接后端 WebSocket接口registry.addEndpoint("/broadcast", "/point")// 允許所有源跨域。還可以指定ip配置:http://ip:*// 低版本的SpringBoot(2.1.5.RELEASE 就不行)不行.setAllowedOriginPatterns(appConfig.getFrontHttpUrl()) // 此處填寫前端頁面地址.withSockJS();}
}

Vue

? ? ? ? 在用戶登錄之后,首先初始化WebSocket 連接,然后定義全局通知的回調,在回調函數onGlobalNotification中實現調用windows自帶的通知功能Notification。

// 初始化 WebSocket 連接
WebSocketService.connect();
// 定義全局通知的回調
WebSocketService.onGlobalNotification = (message) => {this.sendNotification('xxx',message)// this.$bus.$emit("postTrigger")
};
    // 發送通知的方法sendNotification (title, body) {// console.log("sendNotification", Notification.permission)// 檢查瀏覽器是否支持 Notification APIif ('Notification' in window) {// 如果通知權限已經授予if (Notification.permission === "granted") {new Notification(title, {body: body,icon: logoIcon,requireInteraction: true});} else if (Notification.permission !== "denied") {// 請求用戶授權Notification.requestPermission().then(permission => {if (permission === "granted") {new Notification(title, {body: body,icon: logoIcon,requireInteraction: true});}});}} else {console.log("瀏覽器不支持通知功能。");}},

? ? ? ? 在需要發送消息的地方使用函數sendMessage,在MethodApi處填寫后端對應接口。

WebSocketService.sendMessage('/MethodApi', {content: "message you want send"});

Springboot

? ? ? ? 在后端需要在controller文件中實現對應的MethodApi接口函數, 確定消息傳遞的目標用戶與對應的消息,調用messagingTemplate中的函數convertAndSendToUser,完成在頻道/user/userid/alone/getResponse的消息通知。

controller.java
@Autowired
private SimpMessagingTemplate messagingTemplate;// p2p notification
@MessageMapping("/MethodApi")
public void p2pNotify(String content){System.out.println(content);// 可在此處通過接受到的消息確定目標用戶 userid(int) 與 對應的消息 message(string)System.out.println("=====發送通知=====");messagingTemplate.convertAndSendToUser(userid.toString(),"/alone/getResponse",message);
}

效果圖

? ? ? ? 此時就可以在本地進行測試了,效果如下:

服務器部署

? ? ? ? 因為windows系統通知需要瀏覽器給予網頁權限,所以需要vue啟用https協議,配置如下:

module.exports = {devServer: {port:8001,https:true,proxy: {'/api': {target: "http://localhost:8091/", // 代理目標的基礎路徑secure: true,  // 如果是https接口,需要配置這個參數changeOrigin: true, // 支持跨域pathRewrite: {'^/api': '',}}}},
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/76704.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/76704.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/76704.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

云手機如何防止設備指紋被篡改

云手機如何防止設備指紋被篡改 云手機作為虛擬化設備&#xff0c;其設備指紋的防篡改能力直接關系到賬戶安全、反欺詐和隱私保護。以下以亞矩陣云手機為例&#xff0c;講解云手機防止設備指紋被篡改的核心技術及實現方式&#xff1a; 系統層加固&#xff1a;硬件級安全防護 1…

有人DTU使用MQTT協議控制Modbus協議的下位機-含數據庫

本文為備忘錄&#xff0c;不做太多解釋。 DTU型號&#xff1a;G780 服務器&#xff1a;win2018 一。DTU設置 正確設置波特率&#xff0c;進入配置狀態&#xff0c;獲取當前參數&#xff0c;修改參數&#xff0c;設置并保存所有參數。 1.通道1設置 2.Modbus輪詢設置 二&am…

湖北師范大學計信學院研究生課程《工程倫理》9.6章節練習

以下是圖片中識別出的文字內容: 1【單選題】當工程師發現所在的企業或公司進行的工程活動會對環境、社會和公眾的人身安全產生危害時,應該及時地給予反映或揭發。這屬于工程師的( ) A、職業倫理責任 B、社會倫理責任 C、個人倫理責任 D、法律責任 2【單選題】下列哪個不屬于工…

Axure RP 9 詳細圖文安裝流程(附安裝包)教程包含下載、安裝、漢化、授權

文章目錄 前言一、Axure RP 9介紹二、Axure RP 9 安裝流程1. Axure RP 9 下載2. 啟動安裝程序3. 安裝向導操作4.完成安裝 三、Axure RP 9 漢化四、Axure RP 9授權 前言 本基礎安裝流程教程&#xff0c;將以清晰、詳盡且易于遵循的步驟介紹Axure RP 9 詳細圖文安裝流程&#xf…

SpringBoot全局exception處理最佳實踐

目錄 自定義異常類 拋出異常 全局異常處理器 自定義異常類 通常會繼承 Exception 或其子類(如 RuntimeException)來定義業務異常類,用于封裝業務相關的錯誤信息。一般選擇繼承 RuntimeException,因為它是一個非受檢異常,在方法中拋出時不需要顯式聲明。 // 自定義業…

node ---- 解決錯誤【Error: error:0308010C:digital envelope routines::unsupported】

1. 報錯 在 Node.js 18.18.0 的版本中&#xff0c;遇到以下錯誤&#xff1a; this[kHandle] new _Hash(algorithm, xofLen);^ Error: error:0308010C:digital envelope routines::unsupported這個錯誤通常發生在運行項目或構建時&#xff0c;尤其是在使用 Webpack、Vite 或其他…

浙江大學鄭小林教授解讀智能金融與AI的未來|附PPT下載方法

導 讀INTRODUCTION 隨著人工智能技術的飛速發展&#xff0c;智能金融已成為金融行業的重要變革力量。浙江大學人工智能研究所的鄭小林教授在2025年3月24日的《智能金融&#xff1a;AI驅動的金融變革》講座中&#xff0c;深入探討了新一代人工智能在金融領域的應用及未來展望。 …

如何實現瀏覽器中的報表打印

在瀏覽器中實現打印一個報表&#xff0c;可以通過以下幾種方法來完成。這里介紹一個基本的流程和相關代碼示例&#xff1a; 1. 使用 JavaScript 的 window.print() 方法 這是最簡單的方法&#xff0c;它會打開打印對話框&#xff0c;讓用戶選擇打印選項。 示例代碼&#xff1…

Linux系統調用編程

進程和線程 進程是操作系統資源分配的基本單位&#xff0c;擁有獨立的地址空間、內存、文件描述符等資源&#xff0c;進程間相互隔離。每個進程由程序代碼、數據段和進程控制塊&#xff08;PCB&#xff09;組成&#xff0c;PCB記錄了進程狀態、資源分配等信息。 線程是…

【力扣hot100題】(054)全排列

挺經典的回溯題的。 class Solution { public:vector<vector<int>> result;void recursion(vector<int>& nums,vector<int>& now){if(nums.size()0){result.push_back(now);return ;}for(int i0;i<nums.size();i){now.push_back(nums[i]);…

【Ragflow】11. 文件解析流程分析/批量解析實現

概述 本文繼續對ragflow文檔解析部分進行分析&#xff0c;并通過腳本的方式實現對文件的批量上傳解析。 文件解析流程 文件解析的請求處理流程大致如下&#xff1a; 1.前端上傳文件&#xff0c;通過v1/document/run接口&#xff0c;發起文件解析請求 2.后端api\apps\docum…

2024年零知識證明(ZK)研究進展

Sumcheck 整個領域正在轉向更多地依賴于 Sumcheck Protocol Sumcheck是用于驗證多項式承諾的協議,常用于零知識證明(ZKP)中,尤其是在可驗證計算和擴展性上。它的主要目的是通過對多項式進行分段檢查,從而保證某個多項式在給定輸入上的正確性,而不需要直接計算出整個多項…

thinkphp每條一級欄目中可自定義添加多條二級欄目,每條二級欄目包含多個字段信息

小程序客戶端需要展示團購詳情這種結構的內容,后臺會新增多條套餐,每條套餐可以新增多條菜品信息,每條菜品信息包含菜品名稱,價格,份數等字段信息,類似于購物網的商品多規格屬性,數據表中以json類型存儲,手寫了一個后臺添加和編輯的demo 添加頁面 編輯頁面(json數據…

Vue3引入ElementPlus

1.ElementPlus屬于第三方的應用框架&#xff0c;官網地址&#xff1a;設計 | Element Plus &#xff0c;學習可以參考該網站的指南。 2.安裝element-plus &#xff0c;指令為&#xff1a;npm install element-plus --save 3.引入elementplus的全局&#xff0c;組件、樣式、圖標…

react+antd封裝一個可回車自定義option的select并且與某些內容相互禁用

需求背景 一個select框 現在要求可多選 并且原有一個any的選項 其他選項為輸入后回車自己增加 若選擇了any 則其他選項不可選擇反之選擇其他選項any不可選擇 并且回車新增時也不可直接加入到選中數組只加入到option內 并且不可重復添加新內容 實現過程 <Form.Item …

Oracle數據庫數據編程SQL<8 文本編輯器Notepad++和UltraEdit(UE)對比>

首先&#xff0c;用戶界面方面。Notepad是開源的&#xff0c;界面看起來比較簡潔&#xff0c;可能更適合喜歡輕量級工具的用戶。而UltraEdit作為商業軟件&#xff0c;界面可能更現代化&#xff0c;功能布局更復雜一些。不過&#xff0c;UltraEdit支持更多的主題和自定義選項&am…

【學Rust寫CAD】30 Alpha256結構體補充方法(alpha256.rs)

源碼 impl Alpha256 {#[inline]pub fn alpha_mul(&self, x: u32) -> u32 {let mask 0xFF00FF;let src_rb ((x & mask) * self.0) >> 8;let src_ag ((x >> 8) & mask) * self.0;(src_rb & mask) | (src_ag & !mask)} }代碼分析 功能 輸…

Linux systemd 服務全面詳解

一、systemd 是什么&#xff1f; systemd 是 Linux 系統的現代初始化系統&#xff08;init&#xff09;和服務管理器&#xff0c;替代傳統的 SysVinit 和 Upstart。它不僅是系統啟動的“總指揮”&#xff0c;還統一管理服務、日志、設備掛載、定時任務等。 核心作用 服務管理…

jetson AGX orin--ARM64 換源報錯Packages 404 Not Found [IP: 2402:f000:1:400::2 443]

問題 原因&#xff1a; ARM64結構不能使用X86結構的源&#xff0c;清華源不完全支持ARM64。使用下面這個源 sudo vim /etc/apt/sources.list 刪掉原來的&#xff0c;改成這個 # ARM64 架構專用源 deb [archarm64] http://ports.ubuntu.com/ubuntu-ports focal main restrict…

ARM 性能分析工具:Streamline

文章目錄 1. 前言2. 安裝2.1 在 Host 安裝 Arm Performance Studio2.2 在 ARM 目標平臺安裝 gatord 3. 使用3.1 離線方式3.2 在線方式3.3 添加符號表 4. 參考資料 1. 前言 限于作者能力水平&#xff0c;本文可能存在謬誤&#xff0c;因此而給讀者帶來的損失&#xff0c;作者不…