如何向所有登录用户发送通知
Posted
技术标签:
【中文标题】如何向所有登录用户发送通知【英文标题】:How to send notification to all logged in users 【发布时间】:2013-01-15 06:11:14 【问题描述】:我在 mysql 应用程序上有一个 Spring MVC、Spring Thymeleaf、Spring Security 和 Hibernate。我的任务是通知所有当前登录的用户,如果他们正在查看的页面有新数据,以便用户可以刷新并获取一组新数据。
我猜我可以将所有登录的用户存储在 ApplicationScope 会话中,然后以某种方式通知他们。但我以前从未这样做过,也不知道它有多安全。
任何人都可以就如何做到这一点提出任何想法吗?
【问题讨论】:
听起来像是 Comet 或 Websockets 的工作 我不确定这是特定于弹簧的 - 它是拉式还是推式。拉 - 用户定期从预期位置请求信息(可能是数据库表)。 Push - 服务器将更新后的数据直接发送给用户。拉模型很简单。要使推送模型工作,您需要支持异步的 Servlet 3.0 和 Spring 3.2。 blog.springsource.org/2012/05/16/… 当您需要实时数据时,最好使用推送。 P.S.我认为您根本不需要存储用户-您可以创建登录用户将用来检查通知的服务-如果此服务受 Spring Security 保护,则只有登录用户可以使用它。 我认为您可以尝试不同的方式来实现此功能,用户可以向服务器发送请求以检查是否存在任何通知。 【参考方案1】:您需要推/拉架构(从服务器端开始发送消息)。您使用的所有 Spring 框架都无法做到这一点。查看气氛https://github.com/Atmosphere/atmosphere
然后,每当新数据被持久化(您的 DAO 层可以触发此操作)时,您就可以通过 Atmosphere servlet 将新消息推送给所有订阅用户。 Atmosphere 使用“频道”,因此您可以为用户所在的页面使用预定义的频道名称,并且所有用户都会收到消息。您还可以使用 Spring 安全性保护 Atmosphere servlet,以便未经身份验证的用户无法获得通知。
【讨论】:
Spring 现在支持向客户端推送数据:spring.io/guides/gs/messaging-stomp-websocket【参考方案2】:基于上述 cmets,您可以使用以下方式实现拉取架构:
将所有事件存储在一个中心位置,可供所有会话(单例、数据库等)访问。确保有一个顺序 ID。
存储在会话中检索到的最新事件 ID。 根据需要,查询 ID 大于会话中存储的最新 ID 的事件。
希望这会有所帮助。
【讨论】:
以上是关于如何向所有登录用户发送通知的主要内容,如果未能解决你的问题,请参考以下文章