像是 這個問題, 我想要傳給特定的使用者利用sessionID或是使用者名稱.
我試過這個 回答 的方式,但是使用者還是無法接收到訊息,以他的說法,使用者不需要登入就可以接收都針對他的訊息,也不需要去subscribe好幾個channel.
這是我程式碼的設定.
我在使用者連線的時候紀錄sessionID
@EventListener
private void handleSessionConnected(SessionConnectEvent event) {
SimpMessageHeaderAccessor headers = SimpMessageHeaderAccessor.wrap(event.getMessage());
String username = headers.getNativeHeader("login").get(0);
String sessionId = headers.getSessionId();
User user = new User(username, sessionId);
participantRepository.add(user);
Success", headers.getMessageHeaders());
}
傳送廣播訊息 in Controller
@MessageMapping("/chat")
public void handleChat(ChatMessage message, SimpMessageHeaderAccessor headerAccessor) throws Exception{
logger.debug(">>>[CHAT MESSAGE]");
JsonParser parser = new JsonParser();
String jsonMessage = gson.toJson(message);
JsonObject jsonObMessage =
parser.parse(jsonMessage).getAsJsonObject().get("map").getAsJsonObject();
messagingTemplate.convertAndSend("/queue", message);
}
傳送 私人訊息 in Controller
@MessageMapping("/chat.{user}")
public void handlePrivateChat(@Payload ChatMessage message, SimpMessageHeaderAccessor headerAccessor) throws Exception{
logger.debug(">>>[PRIVATE CHAT MESSAGE]");
JsonParser parser = new JsonParser();
SimpMessageHeaderAccessor responseAccessor = SimpMessageHeaderAccessor
.create(SimpMessageType.MESSAGE);
String jsonMessage = gson.toJson(message);
JsonObject jsonObMessage =
parser.parse(jsonMessage).getAsJsonObject().get("map").getAsJsonObject();
User toUser = activeUsers.getByName(jsonObMessage.get("to").getAsString());
String destinateSessionID = toUser.getSessionID();
responseAccessor.setSessionId(destinateSessionID);
responseAccessor.setLeaveMutable(true);
MessageHeaders responseMessageHeader = responseAccessor.getMessageHeaders();
if(toUser != null){
messagingTemplate.convertAndSendToUser(destinateSessionID, "/queue", message, responseMessageHeader);
}
}
我的message handler都可以收到使用者發送的訊息,但只有廣播訊息client side接收得到.請問有人可以幫忙解答嗎?
我的 WebSocketConfig
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/queue", "/topic");
registry.setApplicationDestinationPrefixes("/app");
}
沒設定user吧
好像用java-security登入,會自動幫忙設定,沒有就要自己設定
Imp DefaultHandshakeHandler中的determineuser,可以用sessionID註冊或其他字串等,
https://github.com/ip258852/springbootdemo/tree/master/boot-ws-demo