Session 在GWT中自动登录的会话和cookie

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()) 现在,在返

我知道在这方面已经有很多问题了,但我仍然没有找到一个明确的答案。我想做的是让用户在登录后(比如说2周)或者直到他们注销时都能被记住。下面是我认为应该发生的事情,我想知道是否有更多经验的人可以告诉我我是对还是错

用户首次登录。对服务器的RPC调用返回一个“UserInfo”对象,其中包含一个新的sessionID。Aka在服务器上发生这种情况,并返回
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..而不是所有会话变量,当他再次登录时。