在我的聊天应用程序中,我在服务器上使用spring(websocket),并通过我的角度应用程序通过sockjs连接到它。总是如果我刷新有角的(ctrl-s)(我打开了2个单独的浏览器窗口,并以不同的用户身份登录),@ EventListener方法“ handleSubscribeEvent”中就会发生竞争。从同一用户(而不是两个用户)两次触发该事件。尽管会话ID在握手方法中有所不同。
为什么会这样?
WebSocketController.java中的映射方法:
@MessageMapping("/messages")
public void sendToSpecificUser(@Payload String receiver) {
this.template.convertAndSendToUser(receiver, "/chat/messages", "");
}
@EventListener
public void handleSubscribeEvent(SessionSubscribeEvent event) {
System.out.println("<===> SUBSCRIBE - EVENT");
System.out.println("username: " + event.getUser().getName());
StompHeaderAccessor headerAccessor = StompHeaderAccessor.wrap(event.getMessage());
System.out.println("sessionId: " + headerAccessor.getSessionAttributes().get("sessionId").toString());
}
通过SockJS的Websocket连接:
const socket = new SockJS("http://localhost:8080/socket");
this.stompClient = Stomp.over(socket);
const that = this
this.stompClient.connect({}, () => {
that.stompClient.subscribe("/user/chat/messages", () => {
// If a new message is received, then update the view
that.ngOnInit()
});
});
发送消息:
this.stompClient.send(`/chat/messages`, {}, this.receiver);
我希望事件的用户名是订阅websocket的用户,但实际上,订阅的用户名是我的两个用户之一。如果刷新角度应用程序,则这是服务器端的输出。
----接收到新连接----
<===>订阅-事件
用户名: john-doe
sessionId: 4E5EB52635C72B692A2637D760E1162B
----接收到新连接----
<===>订阅-事件
用户名: john-doe <-这里应该是ex的另一个用户。约翰·斯诺
sessionId: 750C516ABB12BEEC89708BC0DF43D1F4
但是其中一个用户应该是另一个。