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.