Spring Stomp@SubscribeMapping用于用户目标

Spring Stomp@SubscribeMapping用于用户目标,stomp,spring-websocket,Stomp,Spring Websocket,当用户使用@SubscribeMapping注释订阅stomp用户目标时,我试图得到通知。我的想法是在它加入时向发送一些初始化数据 尽管我无法使其正常工作: Javascript: stompClient.subscribe('/user/monitor', function(msg) { console.log(msg); }); Java方面: @SubscribeMapping("/monitor-user{clientId}") publ

当用户使用@SubscribeMapping注释订阅stomp用户目标时,我试图得到通知。我的想法是在它加入时向发送一些初始化数据

尽管我无法使其正常工作:

Javascript:

stompClient.subscribe('/user/monitor', function(msg) {
            console.log(msg);    
        });
Java方面:

@SubscribeMapping("/monitor-user{clientId}")
public void init(@DestinationVariable("clientId") String clientId) {
    messagingTemplate.convertAndSend("/user/" + clientId + "/monitor", getOps());
}
我尝试了许多映射组合,例如“/user/monitor-{clientId}”,“/user/monitor”(删除clientId),但都没有成功

调用此函数所需的映射值是多少


谢谢大家!

由于客户端订阅了“/user/monitor”队列,因此server@SubscribeMapping注释必须是“/user/monitor”而不是“/user/monitor{something}”

服务器可以根据您的身份验证方案了解客户端是什么。如果使用sockjs websocket,则可以使用HTTP身份验证,从而利用Spring安全性,并向函数中添加一个“Principal”参数,该参数将保存用户信息:

@SubscribeMapping("/monitor")
public void init(Principal p) {
    String user = p.getName();
    messagingTemplate.convertAndSendToUser(user, "/monitor", getOps());
}
如果不使用http身份验证,则可以向服务器发送用户信息,例如添加可使用SimpMessageHeaderAccessor从服务器访问的自定义STOMP头:

@SubscribeMapping("/monitor")
public void init(SimpMessageHeaderAccessor accessor) {
    String user = accessor.getFirstNativeHeader("userid");
    messagingTemplate.convertAndSendToUser(user, "/monitor", getOps());
}
另一种方法是订阅包含用户信息的不同队列名称(这可能是您的建议)。客户机必须使用与以下类似的代码:

stompClient.subscribe('/topic/byUser/'+userId, function(msg) {
    console.log(msg);    
});
以便服务器可以通过以下方式访问它:

@SubscribeMapping("/byUser/{userId}")
public void init(@DestinationVariable String userId) {
    messagingTemplate.convertAndSendToUser(userId, "/monitor", getOps());
}

但在这种情况下,请记住该队列是公共的,因此,如果其他客户端知道其他客户端名称,则可以访问其消息。

请重新表述您的问题好吗?您试图实现的用例是什么?用例1:当用户Alice订阅目标“/foobar”时,您希望将消息发送到“/monitor”主题,这是一个用于监视目的的特殊主题,每次用户订阅“/foobar”时都会收到消息。用例2:您希望在Alice订阅“/foobar”时立即向她发送初始化数据。在第二个代码示例中,
convertAndSendToUser()
方法将调用转换为
/user/{userId}/monitor
。Spring知道如何从主体名称中找到连接,但是它如何从它从未知道的自定义头中找到连接呢?