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

有帮助吗?

解决方案

我认为一个解决方案可能是避免使用 @SendToUser 并使用raw 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并在队列前面添加“/用户/”(仅用户侧)。休息作品魔术: - )

而不是

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)但是现在cookie是不是默认可访问来自JavaScript (对于Tomcat)这是一个更困难的前景。

试试这个。它为我工作了

@Autowired
private SimpMessagingTemplate messagingTemplate;

@MessageMapping("/getHello")
public void sendReply( MessageHeaders messageHeaders, @Payload String message, @Header(name = "simpSessionId") String sessionId){
        messagingTemplate.convertAndSendToUser(sessionId, "/queue/hello", "Hello "+ message, messageHeaders);
}
.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top