GWT 客户端的会话管理

Session management in GWT client side

我正在构建一个 GWT 应用程序,其中有 3 个 RootPanel,其中一个包含登录面板(用户 ID 和密码)。我的应用程序是一页应用程序。为了登录,用户的 id 和密码通过 RPC 从服务器验证,如果组合正确,下一个面板加载,这是我的主要应用程序。由于是单页应用,我想知道在这个应用中应该如何进行session管理。

我在不同的 GWT 应用程序中使用的几种方法

  • 在每个 RPC 上检查用户的凭据 (client/server)。遵循通用 编程(每个 RPC 中明显的时间延迟:-/
  • Using Thread Local首选方式

getThreadLocalRequest().getSession().setAttribute("user", user); //and get

  • 使用 Cookie 允许用户的 Web 浏览器 'remember' 登录。
  • 我没有使用的其他几个。例如:本地存储 (not secured, dependent)

您可以在您的应用程序中配置会话 web.xml 并且您可以编写会话过滤器,它将过滤所有或特定的请求到服务器,您可以在其中验证您的会话是否过期或有效。如果它已过期,您可以将用户重定向到您想要的任何页面。

AJAX 应用程序的一大优势是可以在服务器端无需会话的情况下工作。据我记得,Ray Ryan 在 Google I/O 2009 Google I/O 演讲 "Best practices for Architecting GWT Applicaitons" 中也提到了无状态服务。

在服务器端进行会话会产生一些影响:

  • 会话可能会过期
  • 需要大量资源
  • 它使负载平衡变得更加复杂

即使您在服务器端有会话管理,您也必须在每次服务器调用时检查用户凭据!您永远无法确定,调用您的服务的始终是您的应用程序!

因此,我个人避免在我的 GWT 应用程序中使用服务器端的会话管理。

相反,您可以这样做:

成功登录后,将用户id、登录时间、ip地址等信息存入数据库table。使用记录的密钥,对其进行加密并将此令牌发送回客户端。服务器端的所有服务都应该需要 userId 和 token 作为输入参数。在开始执行业务逻辑之前,您应该检查用户凭据。解密令牌并从数据库中读取记录 table.

  • 未找到记录 -> 用户未登录
  • 不是有效的数据库密钥 -> 用户未登录
  • 将存储的 userId 与您从服务器调用获得的 userId 进行比较 -> 不相等 -> 用户未登录
  • 将存储的 IP 地址与来自服务器调用的 IP 地址进行比较 -> 不相同 -> 用户未登录

等等。

此外,您应该始终使用 SSL!