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

问题描述 投票:1回答:1

我正在创建一个“数字队列票证”应用程序,人们可以在其中主持队列,而其他人可以排队。如果您排队,您基本上会看到当前正在服务的nr,排队的人,ETA等。它是基于Web的,因此我决定使用SSE将更改(例如,当当前正在服务的nr更改时)推送给每个该特定队列。

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

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

我已考虑使用令牌或cookie来完成此操作。但是,SSE标准不支持发送头(或POST数据)。仅获取数据和cookie。我可以将令牌作为查询参数。在这里,我已经阅读了一些信息:

https://community.apigee.com/questions/28794/best-practices-for-passing-an-access-token-without.html

https://tools.ietf.org/html/rfc6750#section-2.3

人们讨论与此有关的安全性问题,但我想,既然人们匿名排队,并且令牌仅用于标识重新连接客户端的事实,这将不是问题。另外,我同时负责后端和前端。

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

我对此还很陌生,因此不胜感激!几天来一直在阅读所有我可以接触到的东西,但到目前为止还没有找到一个好的解决方案。也许还有其他方法可以实现我想要的功能?

http go token server-sent-events
1个回答
0
投票

我肯定会选择Cookie。我没有在Go中尝试过此操作,但是此链接shows how to set and receive cookies

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

第二个选择是尝试通过结合用户代理,IP地址以及其他一些标头来“指纹识别”用户。但是,这是不可靠的,特别是如果用户共享代理,VPN等(并且仍然可以绕过它,例如切换浏览器或使用允许更改用户代理的插件。)

© www.soinside.com 2019 - 2024. All rights reserved.