由于客户端订阅了"/user/monitor"队列,因此服务器的@SubscribeMapping注释必须是针对"/user/monitor"而不是"/user/monitor{something}"。
服务器可以根据您的身份验证方案来理解客户端。如果您使用sockjs websocket,则可以使用HTTP身份验证,并且利用Spring Security,在函数中添加一个"Principal"参数,它将保存用户信息:
@SubscribeMapping("/monitor")
public void init(Principal p) {
String user = p.getName();
messagingTemplate.convertAndSendToUser(user, "/monitor", getOps());
}
如果您不使用HTTP身份验证,您可以发送用户信息给服务器,例如添加一个自定义的STOMP头,可通过SimpMessageHeaderAccessor从服务器访问:
@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());
}
但是请记住,在这种情况下,队列是公共的,因此其他客户端如果知道其他客户端的名称,就可以访问其消息。