如何仅将 websocket 消息发送给一个用户?
Posted
技术标签:
【中文标题】如何仅将 websocket 消息发送给一个用户?【英文标题】:How to send websocket message to only one user? 【发布时间】:2019-09-09 15:54:42 【问题描述】:当我使用@SendToUser 注释发送消息时,就完成了。我在客户端收到消息。
但是当我使用 msgTempl.convertAndSendToUser(...) 发送消息时,我无法在客户端获得响应。
按照我的代码:
@RestController
public class NotifyController
private final SimpMessagingTemplate messagingTemplate;
@Autowired
public NotifyController(SimpMessagingTemplate messagingTemplate)
this.messagingTemplate = messagingTemplate;
@MessageMapping("/chat.send")
/* @SendToUser("/queue/ns-queue")*/
public Message sendMessage(@Payload Message message,
@Header("simpSessionId") String sessionId)
messagingTemplate.convertAndSendToUser(sessionId, "/queue/ns-queue",
message);
return message;
@MessageMapping("/chat.register")/*
@SendToUser("/queue/ns-queue")*/
public Message addUser(@Payload Message message,
SimpMessageHeaderAccessor headerAccessor,
@Header("simpSessionId") String sessionId)
messagingTemplate.convertAndSendToUser(sessionId, "/queue/ns-queue",
message);
return message;
WsConfig:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration implements
WebSocketMessageBrokerConfigurer
private final WebSocketConfigurationProperties configurationProperties;
@Autowired
public WebSocketConfiguration(WebSocketConfigurationProperties
configurationProperties)
this.configurationProperties = configurationProperties;
@Override
public void configureMessageBroker(MessageBrokerRegistry config)
config.enableSimpleBroker(configurationProperties.getTopic());
config.
setApplicationDestinationPrefixes(configurationProperties.getAppPrefix());
@Override
public void registerStompEndpoints(StompEndpointRegistry registry)
registry.addEndpoint(configurationProperties.getEndpoint()).withSockJS();
在客户端:
function connect(event)
username = document.querySelector('#name').value.trim();
if(username)
usernamePage.classList.add('hidden');
chatPage.classList.remove('hidden');
var socket = new SockJS('/ns/ws/endpoint');
stompClient = Stomp.over(socket);
stompClient.connect(, onConnected, onError);
event.preventDefault();
function onConnected(payload)
// Subscribe to the Public Topic
stompClient.subscribe('/user/queue/ns-queue', onMessageReceived);
// Tell your username to the server
stompClient.send("/ns/ws/chat.register",
,
JSON.stringify(sender: username, type: 'JOIN')
)
connectingElement.classList.add('hidden');
我不使用弹簧安全。
请帮帮我!为什么我在使用 SimpMessagingTemplate 时无法发送和接收消息?
【问题讨论】:
【参考方案1】:我找到了解决方案。 您只需在标头中添加 sessionId 并将此标头传递给方法 convertAndSendTosUser ,如下所示:
private void sendMessageToUser(@Payload Message message,
@Header("simpSessionId") String sessionId)
SimpMessageHeaderAccessor headerAccessor =
SimpMessageHeaderAccessor.create(SimpMessageType.MESSAGE);
headerAccessor.setSessionId(sessionId);
headerAccessor.setLeaveMutable(true);
messagingTemplate.convertAndSendToUser(sessionId,
socketConfigurationProperties.getTopic(), message,
headerAccessor.getMessageHeaders());
【讨论】:
以上是关于如何仅将 websocket 消息发送给一个用户?的主要内容,如果未能解决你的问题,请参考以下文章
Spring4.0 WebSocket怎么向指定用户发送信息
websocket前端发送一个消息 后端还没执行完 收不到第二条消息