2013-02-23 75 views
5

我知道这里已经有很多问题了,但我仍然没有找到明确的答案。我想要做的是让用户在登录后记住2周或直到他们注销。以下是我认为应该发生的事情,我想知道是否有人有更多的经验可以告诉我,如果我是对的还是错的。会话和饼干GWT自动登录

用户首次登录。对服务器的RPC调用返回一个'UserInfo'对象,其中包含一个新的sessionID。阿卡在服务器上发生这种情况,返回useruser返回后

user.setSessionId(getThreadLocalRequest().getSession().getId());

现在,我们必须创建Cookie存储在客户端的数据。我是正确地说,我们需要一个cookie来确定的SessionID当前用户与另一:

final long DURATION = 1000 * 60 * 60 * 24 * 14; //duration remembering login - 2 weeks 
Date expires = new Date(System.currentTimeMillis() + DURATION); 

String sessionID = user.getSessionId(); 
String username = user.getUsername(); 
Cookies.setCookie("sessionID", sessionID, expires, null, "/", false); 
Cookies.setCookie("username", username, expires, null, "/", false); 

现在,当用户回来的应用程序在以后的日子,我们检查了饼干和(只要它们存在,没有被删除出于某种原因,如明确从用户注销)使用它们的值通过RPC检查会话有效性服务器:

String sessionID = Cookies.getCookie("sessionID"); 
String username = Cookies.getCookie("username"); 

    if (sessionID != null && username != null){ 
     AsyncCallback<UserInfo> callBack = new AsyncCallback<UserInfo>(){ 

      @Override 
      public void onFailure(Throwable caught) { 

       Window.alert("Error connecting to server."); 


      } 

      @Override 
      public void onSuccess(Boolean sessionValid) { 

       if (sessionValid) 
        loadInitialInterfaceForUser("username"); 
       else 
        loadLoginInterface(); 
      } 

     }; 

    loginSvc.checkSessionValidity(sessionID,username, callBack); 
    } 

    else 
     loadLoginInterface(); 

现在,假设我迄今所做的是正确的(这是一个远射:P)我真正的问题是什么,我应该检查在服务器端checkSessionValidity(sessionID,username)

是否仅仅是提取用户的情况下,我已经存储了服务器端并将sessionIDsessionID进行了比较,我已将其与用户关联?我还检查它没有过期吗?

我知道这是一个长期的,也许不是很好措辞的问题......我正在努力让我的头转过来,所以任何和所有的帮助是非常欢迎的!

干杯,史蒂夫

回答

4

是的,这是一个关键的事情要做。

这里是(在数据库中存储会话ID和用户名)上讨论了一些有趣的观点

对此看看(ofcourse你可以检查他们​​3210而不是servlet
how to check if a sessionId is valid in a servlet (java)

这里是会话管理的GWT

一个很好的例子

http://varuntayur.wordpress.com/2012/01/25/session-management-in-gwt

阅读这也 question on GWT, Cookies and webpage directing

+0

嘿男人非常感谢回复,这个例子让事情变得更加清晰!有一件事我想知道的是,在这个例子中,当用户注销时,他将用户从会话中删除,但不会使用户中存储在数据库中的sessionID失效?这是否应该这样做? – SteveCallender 2013-02-24 11:47:04

+1

看到你正在混合这两个例子,你必须保留在会话中或必须将会话ID存储在数据库中。不需要两者都做。 – 2013-02-24 12:02:28

+0

啊,好吧,我明白了。所以提供了我检查存储在Cookie中的sessionID与存储在数据库中的sessionID没有必要维护会话变量? – SteveCallender 2013-02-24 12:08:16