AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁 > 科技  > 軟件

基于Spring Boot,一步步教你用Websockets和STOMP進(jìn)行消息推送

來源: 責(zé)編: 時間:2023-12-21 17:12:18 295觀看
導(dǎo)讀1 引言推送通知是一種實(shí)時消息傳遞形式,通過它網(wǎng)站可以向用戶實(shí)時通知特定事件。通常使用WebSockets實(shí)現(xiàn)推送通知,這種技術(shù)提供了客戶端和服務(wù)器之間的雙向通信,從而實(shí)現(xiàn)了實(shí)時消息的處理。本文使用WebSockets來實(shí)現(xiàn)推送

1 引言

推送通知是一種實(shí)時消息傳遞形式,通過它網(wǎng)站可以向用戶實(shí)時通知特定事件。通常使用WebSockets實(shí)現(xiàn)推送通知,這種技術(shù)提供了客戶端和服務(wù)器之間的雙向通信,從而實(shí)現(xiàn)了實(shí)時消息的處理。IXv28資訊網(wǎng)——每日最新資訊28at.com

本文使用WebSockets來實(shí)現(xiàn)推送通知,并使用STOMP協(xié)議在客戶端和服務(wù)器之間進(jìn)行通信。IXv28資訊網(wǎng)——每日最新資訊28at.com

2 什么是STOMP

STOMP代表簡單文本導(dǎo)向的消息協(xié)議(Simple Text Oriented Messaging Protocol)。由于WebSockets是一種低級協(xié)議,使用幀(frames)來傳輸數(shù)據(jù),而STOMP是一種高級協(xié)議,定義了如何解釋某些幀類型中的數(shù)據(jù)。這些幀類型包括CONNECT、SEND、ACK等。因此,使用STOMP能夠更加簡化使用WebSockets進(jìn)行數(shù)據(jù)的發(fā)送、接收和解析過程。IXv28資訊網(wǎng)——每日最新資訊28at.com

有了這個基礎(chǔ),接下來創(chuàng)建服務(wù)器應(yīng)用程序。IXv28資訊網(wǎng)——每日最新資訊28at.com

3 創(chuàng)建一個應(yīng)用程序

到https://start.spring.io創(chuàng)建一個Spring Boot應(yīng)用程序,并添加以下依賴項(xiàng):IXv28資訊網(wǎng)——每日最新資訊28at.com

Spring Boot Starter Websockets

現(xiàn)在,使用一個嵌入式消息代理,它將是一個提供WebSocket功能的內(nèi)存中代理。給代理添加一些目的地。這些目的地指的是將要發(fā)送消息的路徑。IXv28資訊網(wǎng)——每日最新資訊28at.com

@Configuration@EnableWebSocketMessageBrokerpublic class WebSocketConfig implements WebSocketMessageBrokerConfigurer {    @Override    public void configureMessageBroker(MessageBrokerRegistry config) {        config.enableSimpleBroker("/all","/specific");        config.setApplicationDestinationPrefixes("/app");    }    @Override    public void registerStompEndpoints(StompEndpointRegistry registry) {         registry.addEndpoint("/ws");         registry.addEndpoint("/ws").withSockJS();    }}

在第一部分中,啟用了一個帶有兩個目的地(/all和/specific)的代理。/all目的地將用于向所有用戶發(fā)送通知,/specific目的地用于向特定用戶發(fā)送通知。IXv28資訊網(wǎng)——每日最新資訊28at.com

接下來,設(shè)置應(yīng)用程序的目的地,即 /app,這樣就可以向應(yīng)用程序發(fā)送信息了。IXv28資訊網(wǎng)——每日最新資訊28at.com

在第二部分中,注冊了STOMP端點(diǎn)。其中一個啟用了SockJS,另一個僅使用WebSocket。之所以這樣做,是因?yàn)椴⒎撬袨g覽器都支持WebSocket,當(dāng)不可用時,可以回退到使用SockJS。IXv28資訊網(wǎng)——每日最新資訊28at.com

4 向所有用戶發(fā)送推送通知

先看一下第一個用例,即向所有用戶發(fā)送推送通知。IXv28資訊網(wǎng)——每日最新資訊28at.com

為此,首先實(shí)現(xiàn)一個控制器,該控制器會把來自一個客戶端的信息轉(zhuǎn)發(fā)給所有客戶端。IXv28資訊網(wǎng)——每日最新資訊28at.com

@org.springframework.stereotype.Controllerpublic class Controller {    @Autowired    SimpMessagingTemplate simpMessagingTemplate;    @MessageMapping("/application")    @SendTo("/all/messages")    public Message send(final Message message) throws Exception {        return message;    }}

在上面的代碼中,我們接受/application端點(diǎn)上的消息。這實(shí)際上是之前定義的應(yīng)用程序目的地/app的子目的地。這意味著客戶端必須把消息發(fā)送到/app/application目的地才能到達(dá)該處理程序。IXv28資訊網(wǎng)——每日最新資訊28at.com

接下來,把傳入的消息轉(zhuǎn)發(fā)到/all/messages。現(xiàn)在,訂閱該目的地的所有客戶端都將收到發(fā)送給所有客戶端的消息。IXv28資訊網(wǎng)——每日最新資訊28at.com

來看看HTML頁面上的客戶端代碼:IXv28資訊網(wǎng)——每日最新資訊28at.com

<script type="text/javascript">        var stompClient = null;        var socket = new SockJS('/ws');        stompClient = Stomp.over(socket);        stompClient.connect({}, function(frame) {            console.log(frame);            stompClient.subscribe('/all/messages', function(result) {                show(JSON.parse(result.body));            });        });

在這里,使用一個STOMP客戶端,在WebSocket上建立連接,然后訂閱/all/messages上的消息。IXv28資訊網(wǎng)——每日最新資訊28at.com

現(xiàn)在,為了將消息發(fā)送給應(yīng)用程序,有以下的JavaScript函數(shù),它將消息發(fā)送到/app/application:IXv28資訊網(wǎng)——每日最新資訊28at.com

function sendMessage() {    var text = document.getElementById('text').value;    stompClient.send("/app/application", {},      JSON.stringify({'from':from, 'text':text}));}

它簡單地從文本字段中獲取文本值,并將其發(fā)送到代理的應(yīng)用程序目標(biāo)。IXv28資訊網(wǎng)——每日最新資訊28at.com

這是通過下面顯示的一個簡單表單進(jìn)行連接的。IXv28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片IXv28資訊網(wǎng)——每日最新資訊28at.com

為了測試這個,我們向所有連接的客戶端發(fā)送一個推送通知"Notification to all"。IXv28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片IXv28資訊網(wǎng)——每日最新資訊28at.com

這里有兩個連接的客戶端,兩個客戶端都立即收到了通知。IXv28資訊網(wǎng)——每日最新資訊28at.com

現(xiàn)在,在這里只是顯示了從WebSocket接收到的內(nèi)容,但可以根據(jù)需要使用CSS和JavaScript來自定義通知彈出窗口或通知標(biāo)簽。IXv28資訊網(wǎng)——每日最新資訊28at.com

這就是如何向所有用戶發(fā)送通知。那么如何向特定用戶發(fā)送通知呢?IXv28資訊網(wǎng)——每日最新資訊28at.com

5 向特定用戶發(fā)送推送通知

要向特定用戶發(fā)送通知,我們需要收件人的用戶ID。這意味著接收方用戶需要登錄并提供一個有效的會話來標(biāo)識用戶的用戶ID。IXv28資訊網(wǎng)——每日最新資訊28at.com

為此,我們將集成Spring Security。因此,添加以下依賴項(xiàng)。IXv28資訊網(wǎng)——每日最新資訊28at.com

Spring Boot Starter Security

添加了Spring Security依賴項(xiàng)后,我們需要定義一個安全配置來允許使用WebSockets進(jìn)行連接。IXv28資訊網(wǎng)——每日最新資訊28at.com

@Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {    http            .authorizeHttpRequests()                .mvcMatchers("/","/ws/**")                .permitAll()            .and()            .authorizeHttpRequests()                .anyRequest().authenticated()            .and()            .formLogin()            .and()            .logout( logout -> logout.logoutSuccessUrl("/"));    return http.build();}@Beanpublic InMemoryUserDetailsManager userDetailsService() {    UserDetails user = User.withDefaultPasswordEncoder()            .username("test")            .password("test")            .roles("USER")            .build();    return new InMemoryUserDetailsManager(user);}

在這里,我們允許所有連接到/ws路徑的連接,以便在沒有任何身份驗(yàn)證的情況下進(jìn)行WebSocket通信,還定義了一個名為"test"的靜態(tài)用戶。IXv28資訊網(wǎng)——每日最新資訊28at.com

還記得在上面的消息代理設(shè)置中創(chuàng)建的/specific目標(biāo)嗎?現(xiàn)在將使用它來發(fā)送特定的消息。IXv28資訊網(wǎng)——每日最新資訊28at.com

首先,在控制器中添加一個處理程序,用于接收消息并將其發(fā)送給特定的用戶,這些用戶將使用它們的用戶名進(jìn)行標(biāo)識。IXv28資訊網(wǎng)——每日最新資訊28at.com

@org.springframework.stereotype.Controllerpublic class Controller {    @Autowired    SimpMessagingTemplate simpMessagingTemplate;    @MessageMapping("/application")    @SendTo("/all/messages")    public Message send(final Message message) throws Exception {        return message;    }    @MessageMapping("/private")    public void sendToSpecificUser(@Payload Message message) {        simpMessagingTemplate.convertAndSendToUser(message.getTo(), "/specific", message);    }}

現(xiàn)在,在sendToSpecificUser方法中,我們接受使用/app/private發(fā)送的消息。消息包含要發(fā)送給接收者的文本以及接收者的用戶ID。IXv28資訊網(wǎng)——每日最新資訊28at.com

消息模板所做的是將消息發(fā)送到以/user開頭的目標(biāo),然后將其附加到我們在convertAndSendToUser函數(shù)調(diào)用中指定的目標(biāo),即/specific,然后附加所指定的用戶的用戶會話ID。IXv28資訊網(wǎng)——每日最新資訊28at.com

因此,convertAndSendToUser將消息發(fā)送到目標(biāo)/user/specific-<user-session-id>。這個目標(biāo)是在用戶登錄并訂閱/user/specific時創(chuàng)建的。IXv28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)用戶登錄并訂閱/user/specific時,它會發(fā)送有效的已登錄會話ID。然后,Spring自動處理訂閱/user/specific將自動訂閱已登錄用戶的特定目標(biāo),即/user/specific-<user-session-id>。IXv28資訊網(wǎng)——每日最新資訊28at.com

這也意味著只有用戶登錄時才能發(fā)送通知。IXv28資訊網(wǎng)——每日最新資訊28at.com

現(xiàn)在,添加一個新的文本塊并訂閱用戶特定的目標(biāo)。IXv28資訊網(wǎng)——每日最新資訊28at.com

socket = new SockJS('/ws');privateStompClient = Stomp.over(socket);privateStompClient.connect({}, function(frame) {        console.log(frame);        privateStompClient.subscribe('/user/specific', function(result) {        console.log(result.body)            show(JSON.parse(result.body));        });    });

圖片圖片IXv28資訊網(wǎng)——每日最新資訊28at.com

打開兩個客戶端,并使用"test"用戶登錄第二個客戶端。可以使用/login端點(diǎn)觸發(fā)登錄。IXv28資訊網(wǎng)——每日最新資訊28at.com

在上面的圖像中,正在以"test"用戶登錄第二個客戶端。IXv28資訊網(wǎng)——每日最新資訊28at.com

登錄后,首先向所有客戶端發(fā)送消息。IXv28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片IXv28資訊網(wǎng)——每日最新資訊28at.com

所以,即使已登錄的用戶也會收到發(fā)送給所有客戶端的通知。IXv28資訊網(wǎng)——每日最新資訊28at.com

現(xiàn)在,向"test"用戶發(fā)送一個私有通知。IXv28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片IXv28資訊網(wǎng)——每日最新資訊28at.com

在上面的圖像中,我們?yōu)樘囟ㄓ脩籼峁┝艘粭l消息,并指定了特定用戶的用戶ID,即"test",通知只會傳遞給已登錄的用戶。IXv28資訊網(wǎng)——每日最新資訊28at.com

這是一個關(guān)于它是如何工作的簡短演示。IXv28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片IXv28資訊網(wǎng)——每日最新資訊28at.com

6 結(jié)語

在本文中,我們學(xué)習(xí)了如何使用Spring Boot應(yīng)用程序、WebSockets和STOMP協(xié)議發(fā)送推送通知。如果希望使用外部的ActiveMQ實(shí)例,只需將其連接到應(yīng)用程序,因?yàn)锳ctiveMQ也支持STOMP協(xié)議。這樣,我們就可以通過應(yīng)用程序?qū)⑾⒅欣^到外部的ActiveMQ實(shí)例,實(shí)現(xiàn)更靈活和可定制的消息傳遞。通過這種方式,可以輕松地實(shí)現(xiàn)推送通知功能,為用戶提供實(shí)時的信息更新和交互體驗(yàn)。希望這篇文章對讀者有所幫助!IXv28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-51263-0.html基于Spring Boot,一步步教你用Websockets和STOMP進(jìn)行消息推送

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 前端 JS 安全對抗原理與實(shí)踐

下一篇: C++實(shí)現(xiàn)鏈表:原理、代碼與解析

標(biāo)簽:
  • 熱門焦點(diǎn)
  • Find N3入網(wǎng):最高支持16+1TB

    OPPO將于近期登場的Find N3折疊屏目前已經(jīng)正式入網(wǎng),型號為PHN110。本次Find N3在外觀方面相比前兩代有很大的變化,不再是小號的橫向折疊屏,而是跟別的廠商一樣采用了較為常見的
  • 7月安卓手機(jī)性能榜:紅魔8S Pro再奪榜首

    7月份的手機(jī)市場風(fēng)平浪靜,除了紅魔和努比亞帶來了兩款搭載驍龍8Gen2領(lǐng)先版處理器的新機(jī)之外,別的也想不到有什么新品了,這也正常,通常6月7月都是手機(jī)廠商修整的時間,進(jìn)入8月份之
  • 5月iOS設(shè)備性能榜:M1 M2依舊是榜單前五

    和上個月一樣,沒有新品發(fā)布的iOS設(shè)備性能榜的上榜設(shè)備并沒有什么更替,僅僅只有跑分變化而產(chǎn)生的排名變動,剛剛開始的蘋果WWDC2023,推出的產(chǎn)品也依舊是新款Mac Pro、新款Mac Stu
  • 印度登月最關(guān)鍵一步!月船三號今晚進(jìn)入環(huán)月軌道

    8月5日消息,據(jù)印度官方消息,月船三號將于北京時間今晚21時30分左右開始近月制動進(jìn)入環(huán)月軌道。這是該探測器能夠成功的最關(guān)鍵步驟之一,如果成功將開始圍
  • 一文掌握 Golang 模糊測試(Fuzz Testing)

    模糊測試(Fuzz Testing)模糊測試(Fuzz Testing)是通過向目標(biāo)系統(tǒng)提供非預(yù)期的輸入并監(jiān)視異常結(jié)果來發(fā)現(xiàn)軟件漏洞的方法。可以用來發(fā)現(xiàn)應(yīng)用程序、操作系統(tǒng)和網(wǎng)絡(luò)協(xié)議等中的漏洞或
  • 一個注解實(shí)現(xiàn)接口冪等,這樣才優(yōu)雅!

    場景碼猿慢病云管理系統(tǒng)中其實(shí)高并發(fā)的場景不是很多,沒有必要每個接口都去考慮并發(fā)高的場景,比如添加住院患者的這個接口,具體的業(yè)務(wù)代碼就不貼了,業(yè)務(wù)偽代碼如下:圖片上述代碼有
  • AMD的AI芯片轉(zhuǎn)單給三星可能性不大 與臺積電已合作至2nm制程

    據(jù) DIGITIMES 消息,英偉達(dá) AI GPU 出貨逐季飆升,接下來 AMD MI 300 系列將在第 4 季底量產(chǎn)。而半導(dǎo)體業(yè)內(nèi)人士表示,近日傳出 AMD 的 AI 芯片將轉(zhuǎn)單給
  • 2299元起!iQOO Pad明晚首銷:性能最強(qiáng)天璣平板

    5月23日,iQOO如期舉行了新品發(fā)布會,除了首發(fā)安卓最強(qiáng)旗艦處理器的iQOO Neo8系列新機(jī)外,還在發(fā)布會上推出了旗下首款平板電腦——iQOO Pad,其最大的賣點(diǎn)
  • 質(zhì)感不錯!OPPO K11渲染圖曝光:旗艦IMX890傳感器首次下放

    一直以來,OPPO K系列機(jī)型都保持著較為均衡的產(chǎn)品體驗(yàn),歷來都是2K價位的明星機(jī)型,去年推出的OPPO K10和OPPO K10 Pro兩款機(jī)型憑借各自的出色配置,堪稱有
Top