Jarné webové zásuvky: Posielajte správy konkrétnemu používateľovi

1. Úvod

V tomto výučbe si popíšeme, ako na to použite Spring WebSockets na zasielanie správ STOMP jednému používateľovi. To je dôležité, pretože niekedy nechceme vysielať každú správu každému používateľovi. Okrem toho si ukážeme, ako tieto správy odosielať bezpečným spôsobom.

Úvod do WebSockets nájdete v tomto skvelom výučbe, ako začať a pracovať. A aby ste sa hlbšie ponorili do zabezpečenia, pozrite si tento článok a zabezpečte implementáciu WebSockets.

2. Fronty, témy a koncové body

Existujú tromi hlavnými spôsobmi, ako určiť, kam sa správy odosielajú a ako sa predplatia pomocou Spring WebSockets a STOMP:

  1. Témy - bežné konverzácie alebo chatovacie témy otvorené pre každého klienta alebo používateľa
  2. Fronty - vyhradené pre konkrétnych používateľov a ich aktuálne relácie
  3. Koncové body - všeobecné koncové body

Poďme sa teraz rýchlo pozrieť na príklad kontextovej cesty pre každú z nich:

  • „/ Topic / films“
  • „/ User / queue / specific-user“
  • „/ Zabezpečené / chat“

Je dôležité si to uvedomiť na odosielanie správ konkrétnym používateľom musíme používať fronty, pretože témy a koncové body túto funkciu nepodporujú.

3. Konfigurácia

Poďme sa naučiť, ako nakonfigurovať našu aplikáciu tak, aby sme mohli posielať správy konkrétnemu používateľovi:

public class SocketBrokerConfig extends AbstractWebSocketMessageBrokerConfigurer {@Override public void configureMessageBroker (MessageBrokerRegistry config) {config.enableSimpleBroker ("/ secure / user / queue / specific-user"); config.setApplicationDestinationPrefixes ("/ spring-security-mvc-socket"); config.setUserDestinationPrefix ("/ zabezpečené / užívateľ"); } @Override public void registerStompEndpoints (register StompEndpointRegistry) {registry.addEndpoint ("/ zabezpečené / miestnosť"). WithSockJS (); }}

Nezabudnite zahrnúť cieľ používateľa, pretože to určuje, ktoré koncové body sú vyhradené pre jednotlivých používateľov.

Všetky svoje fronty a cieľové miesta používateľov tiež označujeme predponou „/ Zabezpečené“ aby vyžadovali autentifikáciu. V prípade nechránených koncových bodov môžeme vynechať „/ Zabezpečené“ predpona (v dôsledku našich ďalších nastavení zabezpečenia).

Z a pom.xml hľadiska nie sú potrebné žiadne ďalšie závislosti.

4. Mapovania URL

Chceme, aby sa náš klient prihlásil do frontu pomocou mapovania adries URL, ktoré zodpovedá nasledujúcemu vzoru:

„/ používateľ / fronta / aktualizácie“

Toto mapovanie bude automaticky transformované používateľom UserDestinationMessageHandler na adresu špecifickú pre reláciu používateľa.

Napríklad, ak máme používateľa s menom „User123“, zodpovedajúca adresa bude:

„/ queue / updates-user123“

Na strane servera pošleme našu odpoveď konkrétneho používateľa pomocou nasledujúceho vzoru mapovania adries URL:

„/ user / {username} / queue / updates“

Aj toto sa premení na správne mapovanie adries URL, ktoré sme si už predplatili na strane klienta.

Takže to vidíme základné zložky sú tu dvojaké:

  1. Pripravte našu špecifikovanú predponu cieľového používateľa (nakonfigurovanú v AbstractWebSocketMessageBrokerConfigurer).
  2. Použite „/ Fronta“ niekde v rámci mapovania.

V nasledujúcej časti sa pozrieme na to, ako presne to urobiť.

5. Vyvolávanie convertAndSendToUser ()

Môžeme sa staticky dovolať convertAndSendToUser () od SimpMessagingTemplate alebo SimpMessageSendingOperations:

@Autowired private SimpMessagingTemplate simpMessagingTemplate; @MessageMapping ("/ secure / room") public void sendSpecific (@Payload Správa msg, hlavný užívateľ, @Header ("simpSessionId") reťazec sessionId) vyvolá výnimku {OutputMessage out = nový OutputMessage (msg.getFrom (), msg.getText (), nový SimpleDateFormat ("HH: mm"). formát (nový dátum ())); simpMessagingTemplate.convertAndSendToUser (msg.getTo (), "/ secure / user / queue / specific-user", out); }

Možno ste si všimli:

@Header ("simpSessionId") Reťazec sessionId

The @ Hlavička anotácia umožňuje prístup k hlavičkám vystaveným prichádzajúcou správou. Napríklad môžeme chytiť prúd sessionId bez potreby komplikovaných zachytávačov. Podobne môžeme získať prístup k aktuálnemu používateľovi cez Principal.

Dôležité je, že prístup, ktorý si zvolíme v tomto článku, poskytuje väčšie možnosti prispôsobenia @sendToUser anotácia vzhľadom na mapovanie URL. Viac informácií o tejto anotácii nájdete v tomto skvelom článku.

Na strane klienta, použijeme pripojiť () v JavaScripte do inicializujte inštanciu SockJS a pripojte sa k nášmu serveru WebSocket pomocou programu STOMP:

var socket = nový SockJS ('/ zabezpečený / izba'); var stompClient = Stomp.over (zásuvka); var sessionId = ""; stompClient.connect ({}, function (frame) {var url = stompClient.ws._transport.url; url = url.replace ("ws: // localhost: 8080 / spring-security-mvc-socket / secure / room / "," "); url = url.replace (" / websocket "," "); url = url.replace (/ ^ [0-9] + \ //," "); console.log (" Váš aktuálny relácia je: "+ url); sessionId = url;} 

Máme tiež prístup k dodávaným sessionId a pripojiť to k „ zabezpečené / izba Mapovanie URL. To nám dáva možnosť dynamicky a manuálne zadávať fronty odberov špecifické pre používateľa:

stompClient.subscribe ('secure / user / queue / specific-user' + '-user' + that.sessionId, function (msgOut) {// handle messages} 

Keď je všetko pripravené, mali by sme vidieť:

A v našej serverovej konzole:

6. Záver

Navštívte oficiálny jarný blog a oficiálnu dokumentáciu, kde nájdete ďalšie informácie o tejto téme.

Vzorky kódu použité v tomto článku sú ako vždy k dispozícii na stránkach GitHub.


$config[zx-auto] not found$config[zx-overlay] not found