gpt4 book ai didi

stomp - Spring Stomp @SubscribeMapping 用于用户目标

转载 作者:行者123 更新时间:2023-12-03 18:35:58 36 4
gpt4 key购买 nike

当用户使用 @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”队列,服务器@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 header ,该 header 可以使用 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());
}

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

关于stomp - Spring Stomp @SubscribeMapping 用于用户目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24890450/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com