Stomp on Spring WebSocket 有种端到Topic下指定用户通信的通信模式:给特定的用户发送消息,例如默认的/user前缀下,客户端可以订阅/user/topic/chat表明监听一个只会发给自己消息的地址/topic/chat,在服务端可以发送到形如/user/{username}/topic/*的目的地或者通过调用方法来给目标用户发送消息,spring将自动解析转化为用户会话唯一的目的地(如/topic/chat-user {session-id},请用源码来展示下spring解析转化的这个流程是怎么实现的?
时间: 2023-11-27 10:03:26
浏览: 106
在 Spring WebSocket 中,用户会话的唯一标识是 Session ID,可以通过 `StompHeaderAccessor` 获取。在消息发送时,可以通过 `@DestinationVariable` 注解将[目标](https://geek.csdn.net/educolumn/06c7a9ffb1969a0ad080048a16f82c4e?spm=1055.2569.3001.10083)[地址](https://geek.csdn.net/educolumn/14a4193cfe4be4597b0afe7044078e22?spm=1055.2569.3001.10083)中的参数解析为方法参数,从而获取[目标](https://geek.csdn.net/educolumn/06c7a9ffb1969a0ad080048a16f82c4e?spm=1055.2569.3001.10083)用户的 Session ID。具体实现流程如下:
1. 接收消息时,使用 `StompHeaderAccessor` 获取用户会话的唯一标识 Session ID:
```java
@MessageMapping("/chat")
public void [han](https://geek.csdn.net/educolumn/0d22b54eaf6bcf967d9625e1679d00b4?spm=1055.2569.3001.10083)dleChatMessage(StompHeaderAccessor accessor, ChatMessage message) {
[string](https://geek.csdn.net/edu/8802d631b97a4a6af1f4d0bbf8527465?dp_token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6NDQ0MDg2MiwiZXhwIjoxNzA3MzcxOTM4LCJpYXQiOjE3MDY3NjcxMzgsInVzZXJuYW1lIjoid2VpeGluXzY4NjQ1NjQ1In0.RrTYEnMNYPC7AQdoij4SBb0kKEgHoyvF-bZOG2eGQvc&spm=1055.2569.3001.10083) sessionId = accessor.getSessionId();
// 进行消息处理
```