我正在设计一个系统,其中一台服务器必须向许多独立客户端发送消息。客户不了解彼此,不应该消费,偷看或以任何其他方式获取有关彼此消息的知识。
因此,我想知道JMS / ActiveMq是否能够控制哪些客户端获取哪些消息?
我希望所有客户端都连接到同一个JSM提供程序(“目标”),只使用针对它们的消息。从服务器的角度来看,这将是一个简单的设置。
另一种方法是从所有客户端获取Web服务端点,并在每次服务器为客户端发送消息时执行ws-calls。我认为这种替代声音“错误”,因为我认为这些声音很臃肿。每个ws呼叫都有很大的开销,这个服务器每天必须拨打1000个电话。在我看来,这对于服务器而言并不是最理想的......
答案 0 :(得分:1)
简答:使用Message selector。
详细答案: 问题没有提到如何启动对话。所以这里是我对这两种情况的答案。
a)如果客户端发起对话(即客户端向服务器发送消息并等待回复)。
这是请求/回复方案。 Messaging / JMS是一个解耦的通信系统。但是request/reply是JMS中的常见模式。它可以使用相关模式实现。
b)如果服务器启动对话(即服务器在没有客户端请求的情况下向客户端发送消息)。
在这种情况下,可以使用类似的方法。
有关机密性的更新。
摘自从this link中提取的信息,对您有用,了解JMS security。
JMS未指定安全性 合同或控制API 消息机密性和完整性。 安全被认为是一种安全 JMS提供程序特定的功能。它是 由系统管理员控制 而不是实施 以编程方式或由J2EE服务器 运行时。
JMS安全性的两个主要功能是身份验证和授权。据我所知,客户端访问的JMS安全性侧重于保护JMS目标(而不是单个消息)。只要客户端可以访问目标,分配给客户端的安全角色就适用于属于目标的所有消息。
基于此,
解决方案1:如果客户端代码由受信任方控制。
在原始答案中按照我的解决方案。 这将确保将消息传递给合适的人。但如果故意修改客户端代码以接收所有消息,则不会保护任何内容。
解决方案2:为每个客户端分配私人目标和用户帐户,并配置安全性,使客户端的用户帐户只能访问其目的地。
注意:找到关于"Restrictions for message selectors to provide message level authorization"的链接。但我认为这是供应商特定的自定义功能。
希望这会有所帮助。