Tavaszi WebSockets: Üzenetek küldése egy adott felhasználónak

1. Bemutatkozás

Ebben az oktatóanyagban leírjuk, hogyan kell használja a Spring WebSockets segítségével STOMP üzeneteket egyetlen felhasználónak. Ez azért fontos, mert néha nem akarunk minden üzenetet minden felhasználónak sugározni. Emellett bemutatjuk, hogyan lehet ezeket az üzeneteket biztonságos módon elküldeni.

A WebSockets bemutatásához olvassa el ezt a nagyszerű oktatóanyagot, amely bemutatja, hogyan lehet elindulni és futtatni. Ha pedig mélyebbre merül a biztonságban, olvassa el ezt a cikket a WebSockets megvalósításának biztosításához.

2. Sorok, témák és végpontok

Vannak három fő módja annak, hogy megmondja, hova küldik az üzeneteket és hogyan iratkoznak fel a Spring WebSockets és a STOMP használatával:

  1. Témák - minden ügyfél vagy felhasználó számára nyitott közös beszélgetések vagy csevegési témák
  2. Sorok - meghatározott felhasználók és aktuális munkameneteik számára fenntartva
  3. Végpontok - általános végpontok

Most vessünk egy gyors pillantást az egyes példákra:

  • „/ Téma / filmek”
  • „/ User / queue / specific-user”
  • „/ Biztonságos / csevegés”

Fontos megjegyezni Sorokat kell használnunk, hogy üzeneteket küldjünk meghatározott felhasználóknak, mivel a témák és a végpontok nem támogatják ezt a funkciót.

3. Konfiguráció

Tanuljuk meg, hogyan konfigurálhatjuk alkalmazásunkat úgy, hogy üzeneteket küldhessünk egy adott felhasználónak:

a public class SocketBrokerConfig kiterjeszti az AbstractWebSocketMessageBrokerConfigurer {@Orride public void configureMessageBroker (MessageBrokerRegistry config) {config.enableSimpleBroker ("/ secured / user / queue / specific-user"); config.setApplicationDestinationPrefixes ("/ spring-security-mvc-socket"); config.setUserDestinationPrefix ("/ biztonságos / felhasználó"); } @Orride public void registerStompEndpoints (StompEndpointRegistry registry) {register.addEndpoint ("/ secured / room"). WithSockJS (); }}

Győződjön meg arról, hogy tartalmaz egy felhasználói rendeltetési helyet, mivel ez határozza meg, hogy mely végpontok vannak fenntartva az egyes felhasználók számára.

Ezenkívül az összes várólistánkat és felhasználói úti célunkat előtaggal látjuk el „/ Biztosított” hogy hitelesítést igényeljenek. Védtelen végpontok esetén eldobhatjuk a „/ Biztosított” előtag (a többi biztonsági beállításunk eredményeként).

A-tól pom.xml szempontból nincs szükség további függőségekre.

4. URL-leképezések

Szeretnénk, ha ügyfelünk feliratkozna egy sorra egy URL-leképezéssel, amely megfelel a következő mintának:

"/ user / queue / updates"

Ezt a leképezést automatikusan átalakítja UserDestinationMessageHandler a felhasználói munkamenet-specifikus címbe.

Például, ha van egy nevű felhasználó „User123”, a megfelelő cím a következő lenne:

"/ queue / updates-user123"

Kiszolgálói oldalon küldjük felhasználóspecifikus válaszunkat a következő URL-leképezési mintával:

"/ user / {felhasználónév} / queue / updates"

Ez is átalakul a megfelelő URL-leképezésbe, amelyet már előfizettünk az ügyféloldalra.

Így azt látjuk az alapvető összetevők itt kétszeresek:

  1. Adja meg a megadott felhasználói rendeltetési hely előtagunkat (itt konfigurálva: AbstractWebSocketMessageBrokerConfigurer).
  2. Használat „/ Queue” valahol a feltérképezésen belül.

A következő részben megvizsgáljuk, hogy pontosan hogyan kell ezt megtenni.

5. Felhívás convertAndSendToUser ()

Nem statikusan hivatkozhatunk convertAndSendToUser () tól től SimpMessagingTemplate vagy SimpMessageSendingOperations:

@Autowired private SimpMessagingTemplate simpMessagingTemplate; A @MessageMapping ("/ secured / room") public void sendSpecific (@Payload Message msg, Fő felhasználó, @Header ("simpSessionId") String sessionId) dobja a Kivételt {OutputMessage out = new OutputMessage (msg.getFrom (), msg.getText (), új SimpleDateFormat ("ÓÓ: mm"). formátum (új Dátum ())); simpMessagingTemplate.convertAndSendToUser (msg.getTo (), "/ Secured / user / queue / specific-user", out); }

Lehet, hogy észrevette:

@Header ("simpSessionId") Karakterlánc sessionId

A @Fejléc az annotáció lehetővé teszi a bejövő üzenet által kitett fejlécek elérését. Például megragadhatjuk az áramot munkamenet azonosító anélkül, hogy bonyolult elfogókra lenne szükség. Hasonlóképpen, keresztül férhetünk hozzá az aktuális felhasználóhoz .

Fontos, hogy a cikkben alkalmazott megközelítés nagyobb testreszabást biztosít a @sendToUser kommentár az URL leképezésekhez. Ha többet szeretne megtudni erről a kommentárról, nézze meg ezt a nagyszerű cikket.

Ügyféloldalon fogjuk használni connect () a JavaScript-ben inicializálja a SockJS példányt, és csatlakozzon a WebSocket szerverhez a STOMP használatával:

var socket = new SockJS ('/ biztonságos / szoba'); var stompClient = Stomp.over (socket); var sessionId = ""; stompClient.connect ({}, function (frame) {var url = stompClient.ws._transport.url; url = url.replace ("ws: // localhost: 8080 / spring-security-mvc-socket / secured / room / "," "); url = url.replace (" / websocket "," "); url = url.replace (/ ^ [0-9] + \ //," "); console.log (" A jelenlegi munkamenet: "+ url); sessionId = url;} 

Hozzáférünk a mellékelthez is munkamenet azonosító és csatolja ezt a biztosított / szoba URL leképezés. Ez lehetővé teszi számunkra, hogy dinamikusan és manuálisan szolgáltassunk egy felhasználóspecifikus előfizetési sort:

stompClient.subscribe ('biztonságos / felhasználó / várólista / specifikus-felhasználó' + '-felhasználó' + that.sessionId, function (msgOut) {// üzenetek kezelése} 

Miután minden elkészült, látnunk kell:

És a szerver konzolunkon:

6. Következtetés

Nézze meg a hivatalos tavaszi blogot és a hivatalos dokumentációt, ha további információt szeretne erről a témáról.

Mint mindig, az ebben a cikkben használt kódminták elérhetők a GitHubon.