当我使用 @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');
}
我不使用 Spring Security。
请帮助我!为什么我使用 SimpMessagingTemplate 时无法发送和接收消息?
最佳答案
我找到了解决方案。 您只需在 header 中添加 sessionId 并将此 header 传递给方法 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());
}
关于java - 如何只向一个用户发送 websocket 消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57857398/