Kratki primjer bilješke @SendToUser Spring Websockets

1. Pregled

U ovom ćemo brzom uputstvu ilustrirati kako poslati poruku određenoj sesiji ili određenom korisniku pomoću Spring WebSockets.

Uvod u gornji modul potražite u ovom članku.

2. Konfiguracija WebSocket-a

Prije svega, trebamo konfigurirajte našeg posrednika poruka i krajnju točku aplikacije WebSocket:

@Configuration @EnableWebSocketMessageBroker javne klase WebSocketConfig proširuje AbstractWebSocketMessageBrokerConfigurer {@Override public void configureMessageBroker (MessageBrokerRegistry config) {config.enableSimpleBroker ("/ topic /", "/ que /", "/ que /", "/ que /", "") config.setApplicationDestinationPrefixes ("/ app"); } @Override public void registerStompEndpoints (Registar StompEndpointRegistry) {registry.addEndpoint ("/ pozdrav"); }}

S @EnableWebSocketMessageBroker mi omogućio razmjenu poruka podržanih posrednikom putem WebSocket-a pomoću TOMP, što je skraćenica od Streaming Text Oriented Messaging Protocol. Važno je napomenuti da se ova napomena mora koristiti zajedno s @Konfiguracija.

Nije obvezno produžiti AbstractWebSocketMessageBrokerConfigurer ali, za brzi primjer, lakše je prilagoditi uvezenu konfiguraciju.

U prvoj smo metodi postavili jednostavnog posrednika poruka temeljenog na memoriji za vraćanje poruka klijentu na odredištima s prefiksom "/tema" i "/red".

A u drugom smo registrirali strme krajnje točke na "/pozdrav".

U slučaju da želimo omogućiti SockJS, moramo izmijeniti dio registra:

registry.addEndpoint ("/ pozdrav"). withSockJS ();

3. Dohvatite ID sesije od strane presretača

Jedan način za dobivanje ID-a sesije dodaje proljetni presretač koji će se aktivirati tijekom rukovanja i dobiti podatke iz podataka zahtjeva.

Ovaj presretač se može dodati izravno u WebSocketConfig:

@Override public void registerStompEndpoints (Registar StompEndpointRegistry) {registry .addEndpoint ("/ pozdrav") .setHandshakeHandler (new DefaultHandshakeHandler () {public boolean beforeHandshake (ServerHttpRequest request, ServerHttpRowshotsHandHowsHandHowsHandHowsHandHowsHandHowsHandHowsHandHowsHandHowsHandHowsHandHowsHandHowsHandHowsHandHowsHandHowsHandHowsHandHowsHandHowsHandHowsHandHowsHandHowsHandHowshandHandhews.And.And.And. ServletServerHttpRequest) {ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) zahtjev; HttpSession session = servletRequest .getServletRequest (). GetSession (); attributes.put ("sessionId", session.getId ()o; ; }

4. WebSocket krajnja točka

Počevši od Spring 5.0.5.RELEASE, nije potrebno raditi prilagodbe zbog poboljšanja @SendToUser napomena koja nam omogućuje slanje poruke na odredište korisnika putem "/ user / {sessionId} /…" rađe nego "/ user / {user} /…“.

To znači da napomena djeluje oslanjajući se na ID sesije ulazne poruke, efektivno šaljući odgovor na privatno odredište sesije:

@Controller javna klasa WebSocketController {@Autowired private SimpMessageSendingOperations messagingTemplate; privatni Gson gson = novi Gson (); @MessageMapping ("/ message") @SendToUser ("/ queue / reply") javni niz processMessageFromClient (@Payload String message, Principal principal) baca izuzetak {return gson .fromJson (poruka, Map.class) .get ("name" ) .toString (); } @MessageExceptionHandler @SendToUser ("/ red / pogreške") javni niz handleException (izuzetak koji se može baciti) {return iznimka.getMessage (); }}

Važno je primijetiti da, @SendToUser označava da bi povratna vrijednost metode obrade poruka trebala biti poslana kao Poruka navedenom odredište (-a) prepunjeno s “/ user / {korisničko ime}.

5. WebSocket klijent

funkcija connect () {var socket = new WebSocket ('ws: // localhost: 8080 / pozdrav'); ws = Stomp.over (utičnica); ws.connect ({}, funkcija (okvir) {ws.subscribe ("/ korisnik / red / pogreške", funkcija (poruka) {alert ("Pogreška" + message.body);}); ws.subscribe ("/ korisnik / red / odgovor ", funkcija (poruka) {alert (" Message "+ message.body);});}, function (error) {alert (" STOMP error "+ pogreška);}); } funkcija disconnect () {if (ws! = null) {ws.close (); } setConnected (netačno); console.log ("Prekinuta veza"); }

Nova WebSocket je stvorena ukazujući na „/pozdrav"Za mapiranje u WebSocketConfiguration.

Kada pretplatimo klijenta na „/ korisnik / red / pogreške"I"/ korisnik / red / odgovor”Ovdje koristimo napomene iz zadnjeg odjeljka.

Kao što vidimo, @SendToUser pokazuje na "red / pogreške", Ali poruka će biti poslana na"/ korisnik / red / pogreške“.

6. Zaključak

U ovom smo članku istražili način slanja poruke izravno korisniku ili ID-u sesije pomoću Spring WebSocket

Kao i uvijek, puni izvorni kod primjera dostupan je na GitHub-u.


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