Spring Websockets @SendToUser没有登录?

我有一个带有websocketfunction的简单弹簧应用程序,到目前为止一切正常。 现在我想使用@SendToUser注释从我的服务器向特定客户端发送消息。 这给了我错误“忽略消息,没有可用的主要信息”。 我知道我的服务器上没有任何登录信息,因此每个用户都是“匿名”且没有委托人(我现在不使用Spring安全性)。 但是每个用户都有一个session-id。 是否有可能以某种方式使用会话ID来区分用户? 我怎样才能实现这一点,以便我的用户获得与session-id相对应的主体?

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

例如。 假设您有一个新的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()); } .... 

使用@SendToUser并在订阅时在队列前添加“/ user /”(仅限用户端)。 rest工作魔术:-)

代替

 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){ ....

基于Biju的答案并使用Stomp生成的会话ID (感谢, mariusz2108在他对类似问题的回答中 ),这里有什么对我有用 (基于Spring的规范示例 )

SpringFramework客户端:

 private SimpMessagingTemplate template; @Autowired public GreetingController(SimpMessagingTemplate template) { this.template = template; } @MessageMapping("/hello") public void greeting(HelloMessage message, @Header("simpSessionId") String sessionId) throws Exception { template.convertAndSend("/queue/greeting-"+sessionId, new Greeting("Hello, " + message.getName())); } 

JavaScript客户端:

 function connect() { var socket = new SockJS('/gs-guide-websocket'); stompClient = Stomp.over(socket); stompClient.connect({}, function (frame) { var sessionId = /\/([^\/]+)\/websocket/.exec(socket._transport.url)[1]; console.log("connected, session id: " + sessionId); stompClient.subscribe('/queue/greeting-'+sessionId, function (greeting) { showGreeting(JSON.parse(greeting.body).content); }); }); } 

您可以使用Web容器的会话ID(例如JSESSIONID)而不是Stomp会话ID,但现在可以从JavaScript (对于Tomcat) 无法访问 cookie,这是一个更难的前景。