iT邦幫忙

0

spring web socket(stomp + sockJS) 傳給特定使用者(更新連結)

  • 分享至 

  • xImage

像是 這個問題, 我想要傳給特定的使用者利用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");
}
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
ip258852
iT邦新手 5 級 ‧ 2018-12-02 16:32:39

沒設定user吧
好像用java-security登入,會自動幫忙設定,沒有就要自己設定
Imp DefaultHandshakeHandler中的determineuser,可以用sessionID註冊或其他字串等,

https://github.com/ip258852/springbootdemo/tree/master/boot-ws-demo

我要發表回答

立即登入回答