Et hurtigt eksempel på forårets websockets '@ SendToUser-kommentar

1. Oversigt

I denne hurtige vejledning illustrerer vi hvordan man sender en besked til en bestemt session eller en bestemt bruger ved hjælp af Spring WebSockets.

For en introduktion til ovenstående modul henvises til denne artikel.

2. WebSocket-konfiguration

Først og fremmest skal vi konfigurer vores meddelelsesmægler og slutpunkt til WebSocket-applikationen:

@Configuration @EnableWebSocketMessageBroker offentlig klasse WebSocketConfig udvider AbstractWebSocketMessageBrokerConfigurer {@ Override public void configureMessageBroker (MessageBrokerRegistry config) {config.enableSimpleBroker ("/ topic /", "/ queue /") config.setApplicationDestinationPrefixes ("/ app"); } @ Override offentligt ugyldigt registerStompEndpoints (StompEndpointRegistry registry) {registry.addEndpoint ("/ greeting"); }}

Med @EnableWebSocketMessageBroker vi aktiveret en mæglerstøttet besked via WebSocket ved hjælp af TRAMPE, som står for Streaming Text Oriented Messaging Protocol. Det er vigtigt at bemærke, at denne kommentar skal bruges i forbindelse med @Konfiguration.

Det er ikke obligatorisk at udvide AbstractWebSocketMessageBrokerConfigurer men for det hurtige eksempel er det lettere at tilpasse den importerede konfiguration.

I den første metode oprettede vi en simpel hukommelsesbaseret meddelelsesmægler til at føre meddelelserne tilbage til klienten på destinationer, der er præfikset med "/emne" og "/kø".

Og i det andet registrerede vi stomp-slutpunkter ved "/hilsen".

Hvis vi ønsker at aktivere SockJS, skal vi ændre registerdelen:

registry.addEndpoint ("/ hilsen"). medSockJS ();

3. Få session-ID af Interceptor

En vej for at få session-id'et tilføjer en Spring Interceptor, som udløses under håndtrykket og får informationen fra anmodningsdataene.

Denne interceptor kan tilføjes direkte i WebSocketConfig:

@Override public void registerStompEndpoints (StompEndpointRegistry registry) {registry .addEndpoint ("/ greeting") .setHandshakeHandler (new DefaultHandshakeHandler () {public boolean beforeHandshake (ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler ws Attributes) ServletServerHttpRequest) {ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) anmodning; HttpSession session = servletRequest .getServletRequest (). GetSession (); attributter.put ("sessionId", session.getId ());} returner sand;}) ; }

4. WebSocket slutpunkt

Fra og med Spring 5.0.5.RELEASE er det ikke nødvendigt at foretage nogen tilpasning på grund af forbedringen af @SendToUser kommentar, der giver os mulighed for at sende en besked til en brugerdestination via “/ bruger / {sessionId} /…" hellere end "/ bruger / {bruger} /…“.

Det betyder, at kommentaren fungerer afhængigt af input-meddelelsens session-id og effektivt sender et svar til destinationen privat til sessionen:

@Controller offentlig klasse WebSocketController {@Autowired privat SimpMessageSendingOperations messagingTemplate; privat Gson gson = ny Gson (); @MessageMapping ("/ meddelelse") @ SendToUser ("/ kø / svar") offentlig String procesMessageFromClient (@Payload String besked, hovedhoved) kaster undtagelse {returner gson .fromJson (besked, Map.class) .get ("navn" ) .toString (); } @MessageExceptionHandler @SendToUser ("/ kø / fejl") offentlig streng handleException (undtagelse, der kan kastes) {return exception.getMessage (); }}

Det er vigtigt at bemærke, @SendToUser angiver, at returværdien af ​​en beskedhåndteringsmetode skal sendes som en Besked til det angivne destination (er) forberedt med “/ bruger / {brugernavn}.

5. WebSocket-klient

function connect () {var socket = new WebSocket ('ws: // localhost: 8080 / greeting'); ws = Stomp.over (stikkontakt); ws.connect ({}, funktion (ramme) {ws.subscribe ("/ bruger / kø / fejl", funktion (meddelelse) {alarm ("Fejl" + meddelelse.krop);}); ws.subscribe ("/ bruger / kø / svar ", funktion (besked) {alarm (" Besked "+ besked.krop);});}, funktion (fejl) {alarm (" STOMP-fejl "+ fejl);}); } afbryd funktion () {if (ws! = null) {ws.close (); } setConnected (false); console.log ("Afbrudt"); }

Et nyt WebSocket er oprettet og peger på “/hilsen”Til kortlægningen WebSocketConfiguration.

Når vi abonnerer klienten på “/ bruger / kø / fejl”Og“/ bruger / kø / svar”Er, hvor vi bruger de bemærkede oplysninger fra sidste afsnit.

Som vi kan se, @SendToUser peger på “kø / fejl”Men meddelelsen sendes til“/ bruger / kø / fejl“.

6. Konklusion

I denne artikel har vi undersøgt en måde at sende en besked direkte til en bruger eller et session-id med Spring WebSocket

Som altid er den fulde kildekode for eksemplerne tilgængelig på GitHub.