【问题标题】:Working with sessions in GWT application在 GWT 应用程序中使用会话
【发布时间】:2012-02-05 13:07:12
【问题描述】:

我有一个 GWT 应用程序,它的后端有 RPC 服务。我目前正在尝试实现用户支持,唯一仍然存在的问题是我应该存储会话数据的方式。

我正在使用

存储会话 ID
getThreadLocalRequest().getSession().setAttribute("sid", "randomSIDgoeshere");

所以,第一个问题更多是针对 Java servlet 而不是针对 GWT。这段代码是否保证下次我这样打电话:

getThreadLocalRequest().getSession().getAttribute("sid");

它要么是空的(如果它被调用的用户还没有访问过设置了 SID 属性的代码段)或者它会与我已经为那个用户保存的 SID 完全相同。换句话说,这两段代码是用户特定的吗? (用户我的意思是单台计算机上的单个浏览器)

第二个问题是关于存储 SID 和一些额外数据(如用户 ID)之间的映射。如果我有这样的代码:

public class MyGwtServiceImpl extends RemoteServiceServlet implements MyGwtService {
  // SID to User ID mappings
  private final Map<String, String> sessions = 
    new HashMap<String, String>();
  ...
}

是否保证sessions 对于所有请求始终是同一个对象,并且除非整个应用程序终止,否则其数据将保持“活动”状态? (例如,Tomcat 已停止)这是正常方法还是我应该将所有这些映射保留在我的数据库中?

【问题讨论】:

    标签: java security session gwt servlets


    【解决方案1】:

    第一:

    是的,它确实保证。下次您在下一个请求中调用getThreadLocalRequest().getSession().getAttribute("sid"); 时,属性 sid 将保留在那里。但请记住,这是本地请求区域,因此只有来自同一用户(浏览器 + ip)的请求才能共享信息。这意味着:

    事实:

    • 用户 A 连接 Firefox
    • 您存储了一个 ID 为 Y 的随机值 X

    案例一

    • 用户 A 连接 Firefox
    • 您可以检索 X

    案例 2

    • 用户 A 连接 Google Chrome
    • 您无法检索值 X

    案例 3

    • 用户 B 连接 Firefox
    • 您无法检索值 X

    所以是的,会话的内容是用户特定的。一个会话中存在的内容并不意味着其他会话中也会存在。

    第二:

    不,不能保证。尽管大多数时候会调用相同的 serverlet 实例,但不能保证始终存在。如果你想在你的 serverlet 中保留属性,你必须将这些属性声明为静态,这样,静态属性就不是特定于用户的。或者你可以存储在ServeletContext中

    我这样说是因为如果很长一段时间都不需要服务小程序,不同的实现(如 Glassfish)可以终止实例(据我记得,我不确定(Glassfish 终止实例) )。但是没有文档说它确实保证将是同一个实例,因此您不能声明非静态属性并在不同实例之间共享。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-05
      相关资源
      最近更新 更多