Websocket:页面重新加载后维护用户会话

问题描述 投票:0回答:2

我有一个简单的单页应用程序,使用 jetty websockets 在服务器和客户端之间进行通信。

问题:每次重新加载页面时,我的 websocket 连接都会被禁用并初始化新的连接。问题是用户应该在每次页面刷新时重新登录。

问题: 如何消除页面刷新时重新登录的需要?

编辑:面临下一个问题:如何决定何时应删除会话?我在服务器端有一个对等对象,它只是 websocket 会话容器。对等点通过

onClose
方法删除,该方法又在删除客户端 Websocket 时调用。问题来了:当用户按 F5 -> 客户端 websocket 损坏 -> 服务器删除相应的 websocket -> 客户端尝试重新加载页面并检查是否有任何会话,但什么也没找到。另一方面,我根本无法停止删除 y 对等点(会话)。

问题:我如何告诉服务器何时删除我的同伴?

java javascript jakarta-ee websocket single-page-application
2个回答
7
投票

为了消除在每次建立新连接时验证 WebSocket 连接的需要,您可以使用 cookie。

首次验证 WebSocket 连接,在 WebSocket 连接上设置 cookie ,并在新连接时重新检查 cookie。

这需要一个允许在 WebSocket 连接上读取和设置 cookie 的 WebSocket 服务器。

如果 WebSocket 连接与包含打开 WebSocket 连接的 JavaScript 的 HTML 页面来自同一源,您还可以使用基于“正常”HTML 表单的登录加 cookie 过程:

    用户打开“login.html”,其中包含用于登录的 HTML 表单
  1. 用户输入用户名/密码,这会通过 HTTP/POST 将 HTML 表单提交到某个 URL
  2. 服务器检查凭据,成功后生成随机 cookie,存储 cookie,并将 cookie 设置在从 HTTP/POST 返回的 HTML 页面上
  3. 后一个返回的页面然后打开到服务器的 WebSocket 连接(该连接位于同一源,因此设置了先前设置的 cookie)
  4. WebSocket 服务器在打开握手时检查是否有 cookie,以及 cookie 是否存储在登录用户的数据库中
  5. 如果是,则WebSocket连接成功。如果没有,WebSocket 服务器不会建立连接,而是将用户重定向到 1。

0
投票
JWT 也是一个很好的方法。 如果 WS 嵌入到正在运行的应用程序中,您可以重复使用相同的 JWT 令牌。

您也可以在 JWT 中传递一些其他详细信息

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