服务器发送事件在前端过滤

问题描述

我遇到以下情况:

enter image description here

多个用户可以同时通过基于Javascript的前端与我基于Java的后端服务建立连接。之后,Java后端可能会从队列中收集消息,并且需要将与从队列中读取的某个业务案例相关的“业务事件”通知相应的用户。但是服务器发送事件(SSE)只能通知一部分用户

目前,我正在定期轮询后端,以了解是否正在查看各自的业务案例,例如ID为A,B,C等的ID的新数据需要显示用户。这是非常低效的,我当时正在考虑使用SSE作为替代方案。

由于我根本不想引入会话处理,因此我将不得不根据前端侧的案例ID(A,B,C,...)过滤所有传入的事件,但实际上是任何前端建立连接的人可能会读取所有已发布的事件。

虽然在某些情况下可以使用上述方案,但是如果SSE包含敏感信息,例如用户1应该收到的私人/个人数据,但用户2或3在更深入地检查时根本看不到他们的浏览器?在这种情况下,前端过滤似乎非常糟糕。

在这里滥用SSE吗?是否有更好的替代方法可以通知前端有关后端的更改?

解决方法

根据提议的意识形态,您的数据可以在任何一侧进行处理。尽管在客户端中处理业务逻辑并不是最好的主意,但我已经看到很多情况下后端开发人员不喜欢也不感兴趣处理某些与业务相关的逻辑,因此,可能的解决方案是在前端处理它们。

如果数据(在您的情况下为事件)可能包含机密信息,则至少有四个可能的选项((长轮询)轮询机制除外):

  1. 后端的会话管理

    此选项非常不言自明,您必须创建某种 后端中的会话管理以跟踪谁是谁,因此 能够将适当的事件发送给合适的人。

  2. 创建一个中间人来处理此类信息

    尽管这不是最干净的解决方案,但是如果您不是后端负责人,并且他没有在您的情况下为您提供帮助,那么最好不要破坏用户的安全性并创建中间层-man网络服务器(这意味着您还必须管理会话)。

  3. 使用加密

    理论上,可以创建一个加密协议,其中只有具有适当私钥的正确客户端才能对消息进行解码。但是,这种机制的实现需要更多的代码,并且最大程度地减少了创建复杂(通常是动态)会话处理基础结构的麻烦。

  4. 什么都不做

    如果您被迫尽快完成功能,只需创建可行的功能,但一定要尝试在适当的实现方式上替换它,然后再将其投入生产分支。

可能是我在StackOverflow上写的最抽象的答案之一,但希望它可以帮助您更优雅地处理这种情况。

,

自己弄清楚答案。如果我想让信息保密,则永远不要将任何信息发送到前端,而应该在后端过滤掉,以免发送事件。

打开连接可以通过参数化的方式完成,例如 在路径/sse/{id}和后端,在处理此连接时,从已建立的连接读取用户信息时,后端应在该通道上发布任何信息。>