春季网络@SendToUser无需登录?

我有一个具有websocket功能的简单弹簧应用程序,到目前为止一切正常。现在,我想使用@SendToUser注释将消息从服务器发送到特定客户端。这给我一个错误“忽略消息,没有可用的主体信息”。我知道我的服务器上没有任何登录名,所以每个用户都是“匿名的”,没有主体(我现在没有使用spring安全性)。但每个用户都有一个会话 ID。是否可以以某种方式使用会话 ID 来区分用户?如何实现这一点,以便我的用户获得与会话ID相对应的主体?


答案 1

订阅时,在队列前面使用并添加“/user/”(仅限订阅者端)。休息魔术:-)@SendToUser

而不是

Java Server: @SendTo("/topic/showResult")

JS Client: stompClient.subscribe('/topic/showResult', function(calResult){  ....

用:

Java Server: @SentToUser("/topic/showResult")

JS Client: stompClient.subscribe('/user/topic/showResult', function(calResult){ ....


答案 2

我认为解决方案可能是避免使用和使用原始,并将消息发送到您控制的开放会话的目标。@SendToUserSimpMessagingTemplate

例如。假设您在新的 websocket 会话中具有某个标识,则可以订阅队列名称中包含该标识符的队列:

stomp.subscribe("/queue/chats" + "-" + mycustomidentifier, onmessage);

现在,在Spring websocket监听器端,您可以使用以下命令定向响应:SimpMessagingTemplate

@Controller
public class MyController {


    @Autowired
    private SimpMessagingTemplate simpMessagingTemplate;

    @MessageMapping("/chats")
    public void handleChat(@Payload ChatMessage message) {
        this.simpMessagingTemplate.convertAndSend("/queue/chats-" + "mycustomidentifier", "[" + getTimestamp() + "]:" + message.getMessage());
    }
....

推荐