Saltar al contenido

Spring Websockets @SendToUser sin inicio de sesión?

La guía o código que encontrarás en este artículo es la solución más eficiente y válida que encontramos a esta inquietud o problema.

Solución:

Usar @SendToUser y agregue “/usuario/” delante de la cola al suscribirse (solo del lado del suscriptor). El descanso hace magia 🙂

En vez de

Java Server: @SendTo("/topic/showResult")

y

JS Client: stompClient.subscribe('/topic/showResult', function(calResult){  ....

usar:

Java Server: @SentToUser("/topic/showResult")

y

JS Client: stompClient.subscribe('/user/topic/showResult', function(calResult){ ....

Creo que una solución podría ser evitar el uso @SendToUser y uso crudo SimpMessagingTemplate y para enviar mensajes a un destino que usted controla para sesiones abiertas.

Por ej. suponiendo que tenía alguna identidad para una nueva sesión de websocket, puede suscribirse a una cola con ese identificador en el nombre de la cola:

stomp.subscribe("/queue/chats" + "-" + mycustomidentifier, onmessage);

Ahora, en el lado del oyente Spring websocket, puede dirigir sus respuestas usando SimpMessagingTemplate:

@Controller
public class MyController {


    @Autowired
    private SimpMessagingTemplate simpMessagingTemplate;

    @MessageMapping("/chats")
    public void handleChat(@Payload ChatMessage message) 
        this.simpMessagingTemplate.convertAndSend("/queue/chats-" + "mycustomidentifier", "[" + getTimestamp() + "]:" + message.getMessage());
    
....

Basándose en la respuesta de Biju y usando el Identificación de sesión generada por Stomp (gracias, mariusz2108 en su respuesta a una pregunta similar), esto es lo que funcionó para mí (basado en el ejemplo canónico de Spring)

Cliente SpringFramework:

private SimpMessagingTemplate template;

@Autowired
public GreetingController(SimpMessagingTemplate template) 
    this.template = template;


@MessageMapping("/hello")
public void greeting(HelloMessage message, @Header("simpSessionId") String sessionId) throws Exception 
    template.convertAndSend("/queue/greeting-"+sessionId, new Greeting("Hello, " + message.getName()));

Cliente JavaScript:

function connect() 
    var socket = new SockJS('/gs-guide-websocket');
    stompClient = Stomp.over(socket);
    stompClient.connect(, function (frame) 
        var sessionId = //([^/]+)/websocket/.exec(socket._transport.url)[1];
        console.log("connected, session id: " + sessionId);
        stompClient.subscribe('/queue/greeting-'+sessionId, function (greeting) 
            showGreeting(JSON.parse(greeting.body).content);
        );
    );

En lugar de la ID de sesión de Stomp, puede usar la ID de sesión de su contenedor web (por ejemplo, JSESSIONID), pero ahora que la cookie no es accesible de forma predeterminada desde JavaScript (para Tomcat), esta es una perspectiva más difícil.

Reseñas y puntuaciones

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *