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!
我正在构建一个 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!