我阅读有关用户目的地的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()
用于来自服务器的未泄露消息。
答案 0 :(得分:1)
在客户端订阅/user/queue/test
并使用convertAndSendToUser
向/topic/test
主题发送消息看起来是正确的。
现在你如何获得"myUser"
值?
您可以在握手期间从request.getUserPrincipal()
获取此值,或在接收消息时注入Principal
; sessionId也适用于此。您可以查看this commit for more details on the matter。
答案 1 :(得分:1)
也许它迟到了回答这个问题,但对于可能面临类似问题的人来说,这就是我所遗漏的:
您要连接的websocket URL也应该是安全的URL。如果不是,则用户和会话之间没有映射,因此您无法使用convertAndSendToUser()
向用户发送消息。
因此,例如您正在使用URL模式/hello
连接到端点,那么它应该是一个安全的端点。