我知道这里已经有很多问题了,但我仍然没有找到明确的答案。我想要做的是让用户在登录后记住2周或直到他们注销。以下是我认为应该发生的事情,我想知道是否有人有更多的经验可以告诉我,如果我是对的还是错的。会话和饼干GWT自动登录
用户首次登录。对服务器的RPC调用返回一个'UserInfo'对象,其中包含一个新的sessionID。阿卡在服务器上发生这种情况,返回user
:user
返回后
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)
?
是否仅仅是提取用户的情况下,我已经存储了服务器端并将sessionID
与sessionID
进行了比较,我已将其与用户关联?我还检查它没有过期吗?
我知道这是一个长期的,也许不是很好措辞的问题......我正在努力让我的头转过来,所以任何和所有的帮助是非常欢迎的!
干杯,史蒂夫
嘿男人非常感谢回复,这个例子让事情变得更加清晰!有一件事我想知道的是,在这个例子中,当用户注销时,他将用户从会话中删除,但不会使用户中存储在数据库中的sessionID失效?这是否应该这样做? – SteveCallender 2013-02-24 11:47:04
看到你正在混合这两个例子,你必须保留在会话中或必须将会话ID存储在数据库中。不需要两者都做。 – 2013-02-24 12:02:28
啊,好吧,我明白了。所以提供了我检查存储在Cookie中的sessionID与存储在数据库中的sessionID没有必要维护会话变量? – SteveCallender 2013-02-24 12:08:16