【问题标题】:Cannot send user message with Spring Websocket无法使用 Spring Websocket 发送用户消息
【发布时间】:2016-04-28 19:56:11
【问题描述】:

我阅读了有关用户目的地的 Spring 文档。 我想使用convertAndSendToUser 方法仅向特定用户发送消息。

这是java代码:

@Controller
public class WebsocketTest {

    @Autowired
    public SimpMessageSendingOperations messagingTemplate;

    @PostConstruct
    public void init(){
        ScheduledExecutorService statusTimerExecutor=Executors.newSingleThreadScheduledExecutor();
        statusTimerExecutor.scheduleAtFixedRate(new Runnable() {                
            @Override
            public void run() {
                messagingTemplate.convertAndSendToUser("myuser","/queue/test", new Return("test"));
            }
        }, 5000,5000, TimeUnit.MILLISECONDS);
    }
}

这是客户端js代码:

var socket = new WebSocket('ws://localhost:8080/hello');
            stompClient = Stomp.over(socket);            
            stompClient.connect("myuser","mypass", function(frame) {
                setConnected(true);
                console.log('Connected: ' + frame);
                stompClient.subscribe('/topic/greetings', function(greeting){
                    showGreeting(JSON.parse(greeting.body).value);
                });
                stompClient.subscribe('/user/queue/test', function(greeting){
                    showGreeting(JSON.parse(greeting.body).value);
                });
            });

首先考虑用户价值这一点是否正确?

stompClient.connect("myuser",...

为什么这个测试不起作用?该用户未收到任何消息。 如果我将目的地切换到/topic/greetings 并将方法更改为convertAndSend(),这可以工作,但显然作为广播,而不仅仅是根据请求向特定用户发送。

小更新

我尝试使用此代码设置对单个用户的回复:

    @MessageMapping("/hello")
    @SendToUser("/queue/test")
    public Return test(){
        return new Return("test");
    }

这行得通,这不是我需要的,因为这个回复只是对来自客户的消息。似乎我不能将convertAndSendToUser() 用于来自服务器的未经请求的消息。

【问题讨论】:

    标签: java spring spring-mvc websocket spring-websocket


    【解决方案1】:

    在客户端订阅/user/queue/test并使用convertAndSendToUser/topic/test主题发送消息看起来是正确的。

    现在你是如何获得"myUser" 值的?

    你可以在握手过程中从request.getUserPrincipal()获取这个值,或者在收到消息时注入Principal; sessionId 在这里也可以工作。您可以查看this commit for more details on the matter

    【讨论】:

      【解决方案2】:

      也许回答这个问题已经晚了,但对于可能面临类似问题的人来说,这就是我所缺少的: 您要连接的 websocket URL 也应该是安全的 URL。如果不是,则用户和会话之间没有映射,因此您无法使用 convertAndSendToUser() 向用户发送消息。

      所以,例如您正在使用 URL 模式 /hello 连接到端点,那么它应该是安全的。

      【讨论】:

        猜你喜欢
        • 2020-05-06
        • 1970-01-01
        • 2016-02-16
        • 2014-04-17
        • 1970-01-01
        • 1970-01-01
        • 2016-08-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多