2012-01-08 56 views
5

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

我存储使用

getThreadLocalRequest().getSession().setAttribute("sid", "randomSIDgoeshere"); 

所以,第一个问题是不是更GWT对Java servlet的会话ID。此代码是否保证下一次我作出这样一个电话:

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

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

第二个问题是关于存储SIDs和一些额外的数据,如用户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停止)这是正常的方法还是我应该坚持所有这些映射到我的数据库?

回答

7

第一张:

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

事实:

  • 用户A使用Firefox连接
  • 你存储一个随机值X与IDŸ

案例1个

  • 用户A连接与火狐
  • 您可以检索X

案例2

  • 用户A使用谷歌浏览器连接
  • 您不能检索值X

案例3

  • 用户B使用Firefox
  • 连接
  • 你不能retr即值X

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

第二个:

不,不能保证。虽然大部分时间都会调用相同的servelet isntance,但不能保证它始终存在。如果你想在你的servelet中保留属性,你必须将这些属性声明为Static,那么THAT静态属性将不是用户特定的。或者你可以存储在ServeletContext

我这样说,因为不同的实现(如Glassfish)可以终止实例,如果servelet不需要很长一段时间(据我记得,我不知道(Glassfish终止实例))。但是没有文档说它确实会保证它是同一个实例,所以你不能声明非静态属性并在不同的实例之间共享。

+0

谢谢,真是太棒了! – agibalov 2012-01-08 22:22:18

相关问题