似乎无法找到此问题的答案,而有关SimpleBrokerMessageHandler的文档不足。

我看了这个例子:https://gerrydevstory.com/2014/03/04/stock-ticker-demo-webapp-using-spring-4-websocket/

并且似乎该客户端向该主题发送消息,则订阅该主题的所有其他客户端也会收到该消息。好像该主题的默认关系是many-to-many

我希望这种关系是one-to-many,这意味着对于许多客户端来说是一台服务器,对于许多客户端和服务器而言,这并不是很多客户端。

此行为表明存在安全性/真实性问题-按照上面链接中的示例,客户可以向其他所有人发送假股票价格,从而冒充服务器。

我也希望如果这是行为,那么在spring websockets和stomp的配置中,它可能会以某种方式被覆盖或更改,但是我只是在任何地方都找不到足够的信息。

所以问题是:


SimpleBrokerMessageHandler的默认行为真的是many-to-many吗?
我是否不正确理解topic的含义?
可以以某种方式更改或控制此行为吗?
如果没有,ActiveMQ或RabbitMQ或任何其他第三方代理对我的需求(实施one-to-many方案)是否有帮助?如何?

最佳答案

前缀为/topic的目的地通常是代理目的地,正如您正确地说的那样,任何人都可以将消息发送到此类目的地,并且所有订户都将接收到这些消息(消息实际上已转发给代理)。和代理中继(使用任何成熟的STOMP代理,例如RabbitMQ或ActiveMQ)。

但是,Spring Security 4(当前在M2中)添加了websocket安全支持,因此您可以限制发送消息或订阅目的地(请参阅JIRA SEC-2713)。如果这还不够,您可以实现自己的ChannelInterceptor并将其添加到clientInboundChannel中,以便您可以根据逻辑处理消息并将其丢弃。

09-10 21:27