Http 服务器发送事件:识别重新连接客户端的最佳实践

Http 服务器发送事件:识别重新连接客户端的最佳实践,http,go,token,server-sent-events,Http,Go,Token,Server Sent Events,我正在创建一个“数字排队票”应用程序,人们可以在这里排队,其他人也可以排队。如果你排队,你将基本上看到当前正在服务的nr、排队人数nr、ETA等。这是基于网络的,我决定使用SSE向特定队列中的每个人推送更改(例如,当当前正在服务的nr更改时) 我需要一种方法来映射/识别每个客户机,这样,如果他们断开连接一段时间,然后重新连接,他们仍然可以保持他们的位置一致。我知道,如果出现错误,浏览器或SSE客户端将自动尝试重新连接。通常会延迟几秒钟,具体取决于浏览器。此外,数据流从断开连接的点继续,因此使用L

我正在创建一个“数字排队票”应用程序,人们可以在这里排队,其他人也可以排队。如果你排队,你将基本上看到当前正在服务的nr、排队人数nr、ETA等。这是基于网络的,我决定使用SSE向特定队列中的每个人推送更改(例如,当当前正在服务的nr更改时)

我需要一种方法来映射/识别每个客户机,这样,如果他们断开连接一段时间,然后重新连接,他们仍然可以保持他们的位置一致。我知道,如果出现错误,浏览器或SSE客户端将自动尝试重新连接。通常会延迟几秒钟,具体取决于浏览器。此外,数据流从断开连接的点继续,因此使用Last-Event-Id不会丢失任何消息

但是,例如,如果用户错误地退出safari,重新打开它并返回到相同的URL,则会建立新的连接,即它不会“重新连接”

我考虑过使用代币或cookies来实现这一点。但是,SSE标准不支持发送标头(或POST数据)。只获取数据和cookie。我可以传递一个令牌作为查询参数。以下是我读到的一些信息:

人们讨论了与此相关的安全问题,但我认为,由于人们匿名排队,而且令牌仅用于识别重新连接的客户端,所以这不会是一个问题。另外,我负责后端和前端

使用cookies也可能有效,但我对它们的工作原理一无所知。我假设我需要一个持久性cookie来识别正在“重新连接”的客户端?如果不是,也许我应该改用WebSocket,或者轮询?。我选择SSE的原因是我只需要单向沟通


我对这个很陌生,所以任何提示都很感激!几天来,我一直在阅读我能掌握的所有东西,但迄今为止还没有找到一个好的解决办法。也许还有其他方法可以实现我想要的东西?

我肯定会选择饼干。我没有在围棋中尝试过这个,但是这个链接

缺点是用户可以通过删除Cookie来绕过它(他们可能会有动机这样做,这样他们就可以跳过队列了?),并且(至少在欧盟)必须显示“我们使用Cookie”通知。您提到了用户关闭浏览器的情况,因此会话cookie是不够的,您需要使用具有过期时间的cookie


第二种选择是尝试通过用户代理、IP地址和其他一些头的组合来“指纹”用户。但这是不可靠的,尤其是当用户共享代理、VPN等时(还有人可以绕过它,例如切换浏览器或使用允许更改用户代理的插件)。

使用cookie使用SSE、WebSocket或轮询来识别客户端。请注意,有些浏览器不支持SSE()。很高兴听到这个消息!我将开始实施带有过期日期的cookies,看看结果如何。我相信最大的缺点就是你提到了“我们使用饼干”的通知。删除cookie只会导致您处于行的末尾。我也在考虑指纹识别,但我相信这是一个更大的挑战,对隐私的侵犯更大。谢谢“删除一个cookie只会导致你排在最后”我倒过来了。这很好。为了欺骗而伪造cookie需要付出更多的努力(特别是如果您使用密码学的思想来获得cookie值)