Session 在GWT中自动登录的会话和cookie
我知道在这方面已经有很多问题了,但我仍然没有找到一个明确的答案。我想做的是让用户在登录后(比如说2周)或者直到他们注销时都能被记住。下面是我认为应该发生的事情,我想知道是否有更多经验的人可以告诉我我是对还是错 用户首次登录。对服务器的RPC调用返回一个“UserInfo”对象,其中包含一个新的sessionID。Aka在服务器上发生这种情况,并返回Session 在GWT中自动登录的会话和cookie,session,gwt,cookies,login,session-cookies,Session,Gwt,Cookies,Login,Session Cookies,我知道在这方面已经有很多问题了,但我仍然没有找到一个明确的答案。我想做的是让用户在登录后(比如说2周)或者直到他们注销时都能被记住。下面是我认为应该发生的事情,我想知道是否有更多经验的人可以告诉我我是对还是错 用户首次登录。对服务器的RPC调用返回一个“UserInfo”对象,其中包含一个新的sessionID。Aka在服务器上发生这种情况,并返回user: user.setSessionId(getThreadLocalRequest().getSession().getId()) 现在,在返
user
:
user.setSessionId(getThreadLocalRequest().getSession().getId())代码>
现在,在返回user
之后,我们必须创建Cookies来存储客户端数据。我说的正确吗?我们需要一个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);
现在,当用户稍后返回应用程序时,我们会检查Cookie(如果它们存在并且由于某些原因(例如用户明确注销)未被删除),并使用它们的值通过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();
String sessionID=Cookies.getCookie(“sessionID”);
字符串用户名=Cookies.getCookie(“用户名”);
if(sessionID!=null&&username!=null){
AsyncCallback callBack=新的AsyncCallback(){
@凌驾
失败时的公共无效(可丢弃){
警告(“连接到服务器时出错”);
}
@凌驾
public void onSuccess(布尔sessionValid){
if(sessionValid)
loadInitialInterfaceForUser(“用户名”);
其他的
loadLoginInterface();
}
};
loginSvc.checkSessionValidity(sessionID、用户名、回调);
}
其他的
loadLoginInterface();
现在,假设我到目前为止所做的是正确的(这有点遥不可及:p),我真正的问题是我应该在服务器端检查什么checkSessionValidity(sessionID,username)
这仅仅是一种获取我存储在服务器端的用户并将sessionID
与我与该用户关联的sessionID
进行比较的情况吗?我还要检查它是否还没有过期吗
我知道这是一个冗长的问题,也许不是很好的措辞。。。我正在努力让我的头周围,所以任何和所有的帮助是非常欢迎的
干杯,史蒂夫是的,这是一件关键的事情
这里讨论了一些有趣的问题(在DB中存储会话id和用户名)
看看这个(当然,您可以在impl class
中检查它们,而不是servlet
)
下面是GWT中会话管理的一个很好的例子
也读一下这个
请查看以下链接
这可能会解决您的问题。嘿,伙计,非常感谢您的回复,这个例子让事情变得更清楚了!我想知道的一件事是,在这个示例中,当用户注销时,他会将用户从会话中删除,但不会使存储在数据库中的sessionID与用户一起失效?不应该也这样做吗?请看,您正在混合这两个示例,要么必须在会话中维护,要么必须在数据库中存储会话id。不用两个都做啊好吧我明白了。因此,如果我检查Cookie中存储的sessionID是否与DB中存储的sessionID一致,我就不必维护会话变量了?是的..您也可以维护会话变量..但不需要将它们存储在DB中。因为您只验证会话id..而不是所有会话变量,当他再次登录时。