Ich entwickle ein Echtzeitbenachrichtigungssystem in Spring 4 mithilfe eines integrierten Message Brokers und STOMP über WebSocket .
Ich möchte in der Lage sein, Nachrichten an einen bestimmten Benutzer gemäß seinem Benutzernamen zu senden.
Um dieses Ziel zu erreichen, verwende ich die Methode convertAndSendToUser
von org.springframework.messaging.simp.SimpMessagingTemplate
wie folgt:
Als Konfiguration:
%Vor%Client-seitig (über JavaScript ), ich sollte einen Kanal abonnieren, indem ich den Benutzernamen (entsprechend einer anderen sehr ähnlichen Frage: Senden einer Nachricht an bestimmte Benutzer auf Spring Websocket ).
%Vor%Dieser letzte Punkt klingt komisch ...
Angenommen, ich bin als w.white auf meiner Webapp angemeldet, indem ich Folgendes abonniere:
%Vor%... Ich werde Nachrichten sehen können, die an w.white gesendet werden, und das ist großartig ... Aber abonnieren:
%Vor%... Ich werde auch Nachrichten sehen können, die an j.pinkman gesendet wurden, und bitte, dass ich momentan als w.white angemeldet bin.
Es ist ein Weg, um dieses Problem zu überwinden?
Unten ist das Protokoll über die Verbindung über WebSocket:
%Vor%Ich habe die Lösung gefunden.
Zunächst ist es wichtig zu wissen, dass der Kanal /user
bereits von Spring STOMP verwaltet wird, und übrigens keine Registrierung erforderlich ist.
Also:
%Vor% Dann habe ich den Zielkanal als /queue/horray
:
Endlich auf dem Client:
%Vor% Jetzt funktioniert es gut! Nachrichten werden nur an den angegebenen Empfänger gesendet, entsprechend dem vom Sicherheitskontext abgerufenen Principal
.
Da Benutzer in meiner Anwendung nicht authentifiziert sind, habe ich einfach die Sitzungs-ID verwendet, um die verschiedenen Themen zu unterscheiden
auf dem Server:
%Vor%Und der Client ist ziemlich einfach
%Vor%Vielleicht nicht der sauberste Weg, aber es funktioniert, und ohne Authentifizierung konnte ich den / user channel
nicht nutzenTags und Links spring websocket stomp spring-messaging