如何向所有登录用户发送通知

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 的事件。

希望这会有所帮助。

【讨论】:

以上是关于如何向所有登录用户发送通知的主要内容,如果未能解决你的问题,请参考以下文章

从 Lambda 向订阅主题的所有用户发送 SNS 通知

通过通知中心向所有用户发送推送通知

我们可以在登录后向特定用户发送桌面推送通知吗?

如何通过 CURL 向所有设备发送 Firebase 通知?

如何根据ios中的api响应时间向用户发送通知

如何向 Apple 和 Android 发送推送通知?