当前位置: 首页 > 知识库问答 >
问题:

无法使用Spring Websocket发送用户消息

段阳夏
2023-03-14

我阅读了关于用户目的地的Spring文档。我想使用transtAndSendToUser方法仅向特定用户发送消息。

这是java代码:

@Controller
public class WebsocketTest {

    @Autowired
    public SimpMessageSendingOperations messagingTemplate;

    @PostConstruct
    public void init(){
        ScheduledExecutorService statusTimerExecutor=Executors.newSingleThreadScheduledExecutor();
        statusTimerExecutor.scheduleAtFixedRate(new Runnable() {                
            @Override
            public void run() {
                messagingTemplate.convertAndSendToUser("myuser","/queue/test", new Return("test"));
            }
        }, 5000,5000, TimeUnit.MILLISECONDS);
    }
}

这是客户端js代码:

var socket = new WebSocket('ws://localhost:8080/hello');
            stompClient = Stomp.over(socket);            
            stompClient.connect("myuser","mypass", function(frame) {
                setConnected(true);
                console.log('Connected: ' + frame);
                stompClient.subscribe('/topic/greetings', function(greeting){
                    showGreeting(JSON.parse(greeting.body).value);
                });
                stompClient.subscribe('/user/queue/test', function(greeting){
                    showGreeting(JSON.parse(greeting.body).value);
                });
            });

首先,考虑用户价值是否正确?

StampClient.connect("myuser",...

为什么这个测试不起作用?此用户未收到任何消息。如果我将目的地切换到/topic/greetings,并将方法更改为convertAndSend(),这将起作用,但显然是作为广播,而不仅仅是根据请求发送给特定用户。

我试图设置一个回复单用户与此代码:

    @MessageMapping("/hello")
    @SendToUser("/queue/test")
    public Return test(){
        return new Return("test");
    }

这是工作,这不是我需要的,因为这个答复只是从客户端的消息。似乎我无法使用convertAndSendToUser()处理来自服务器的未经请求的消息。

共有2个答案

韶和璧
2023-03-14

也许现在回答这个问题已经晚了,但对于那些可能面临类似问题的人来说,我缺少的是:您连接的websocket URL也应该是一个安全的URL。如果不是,则用户和会话之间没有映射,因此您无法使用convertandsendouser()向用户发送消息。

因此,例如,您使用URL模式连接到endpoint/hello,那么它应该是一个安全的endpoint。

胡桐
2023-03-14

在客户端订阅/user/queue/test,并使用convertAndSendToUser/topic/test主题发送消息,看起来差不多正确。

现在,您如何获得“myUser”值?

您可以在握手过程中从request.getUser主体()获取此值,或者在接收消息时注入主体;在这里也可以使用sesionId。您可以查看此提交以了解有关此事的更多详细信息。

 类似资料:
  • 我使用Spring的STOMP over WebSocket实现与一个全功能的ActiveMQ代理。当用户向主题订阅时,在成功订阅之前必须通过一些权限逻辑。我使用ChannelInterceptor应用权限逻辑,如下所示: WebSocketConfig。爪哇: WebSocketSecurityConfig.java: MySubscriptionInterceptor。爪哇: 当没有足够权限的

  • 我使用的是Simado GDT11调制解调器和丰富的USB到串行端口驱动程序。新连接出现在我的设备管理器中 我使用的是smslib示例中指定的基本类,但总有一些错误表明设备没有响应。由于使用USB端口,我添加了轮询参数,但没有效果。Commtest实用程序可以连接到同一个端口,所以我认为端口号不是问题。 Stacktrace: 代码:

  • 我正在尝试使用SpringWebSocket和stomp创建一个聊天应用程序 我正在使用Spring 4.1.1,Stomp。js,ActiveMQ 5.9 在此用户可以通过登录应用程序向他/她的每个朋友发送消息,这些朋友也已登录。为了向特定用户发送消息,我采取以下步骤: 1)用户登录 2)用户订阅“/user/queue/messaging”目的地 这将用于相互发送用户的私人消息 3)当用户想要

  • Google::API::ClientError(InvalidArgument:需要收件人地址) 我检查过用ruby gmail api V0.9发送电子邮件,我也发现了这一点,但它使用了类,而我在gmail api ruby客户端库中找不到。当前,包含字符,但我在没有它的情况下对它进行了测试,结果它不起作用。 而且,我还想在邮件中发送附件。

  • 我想建立一个Android应用程序,允许用户发送通知和数据消息给其他用户。我最近才开始使用Firebase,而Firebase云消息传递对我来说仍然很困惑。 我已经实现了使用Firebase实例ID将消息发送到特定的设备。然而,在我的应用程序中,用户可以使用不同的设备注销和登录他们的账户,所以这不是我真正想要的。我阅读了文档,它非常令人困惑,它们提到了向用户组发送消息和主题(只有应用程序可以订阅,

  • 我的代码如下:, 从服务器通知FCM(C#) 我对上述要求的答复 {"multicast_id":5002368547300,"成功": 1,"失败": 0,"canonical_ids": 0,"结果":[{"message_id":"0:14200031 c4rrr5787蛋"}]} 我假设一旦FCM收到新的通知,它将把这些通知推送到各自的Android设备。 但对我来说,它不起作用。