在 GWT 中自动登录的会话和 Cookie

Posted

技术标签:

【中文标题】在 GWT 中自动登录的会话和 Cookie【英文标题】:Sessions and Cookies to autologin in GWT 【发布时间】:2013-02-09 07:48:26 【问题描述】:

我知道对此已经有很多问题,但我似乎仍然没有找到明确的答案。我想要做的是让用户在登录 2 周后或直到他们注销后被记住。以下是我认为应该发生的事情,我想知道是否有更多经验的人可以告诉我我是对还是错。

用户首次登录。对服务器的 RPC 调用会返回一个“UserInfo”对象,其中包含一个新的 sessionID。 Aka 在服务器上发生这种情况并返回 user

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

现在user 返回后,我们必须创建 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);

现在,当用户稍后返回应用程序时,我们会检查 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();

现在,假设我到目前为止所做的事情是正确的(这有点远:P)我真正的问题是我应该在服务器端检查什么 checkSessionValidity(sessionID,username)

这仅仅是获取我存储在服务器端的用户并将sessionID 与我与用户关联的sessionID 进行比较的情况吗?我还要检查它没有过期吗?

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

干杯,史蒂夫

【问题讨论】:

【参考方案1】:

看看下面的链接。

Cannot use same cookie for multiple GWT applications

这可能会解决您的问题。

【讨论】:

【参考方案2】:

是的,这是关键。

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

看看这个(当然你可以在impl class而不是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

【讨论】:

嘿,非常感谢您的回复,这个例子让事情变得更清楚了!我想知道的一件事是,在示例中,当用户注销时,他会从会话中删除用户,但不会使与用户一起存储在数据库中的 sessionID 无效?不应该这样做吗? 看到你正在混合这两个例子,要么你必须在会话中维护,要么必须将会话 ID 存储在数据库中。不需要两者都做。 啊,好吧,我明白了。因此,如果我检查存储在 Cookie 中的 sessionID 与存储在 DB 中的 sessionID 是否我不必维护会话变量? 是的..您也可以维护会话变量..但不需要将它们存储在数据库中。因为您只验证会话ID..不是所有会话变量,当他再次登录时。

以上是关于在 GWT 中自动登录的会话和 Cookie的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 4 cookie 会话生命周期自动更改

会话超时后自动重定向到登录页面 - JSP,Spring

selenium自动化---获取登录成功后,浏览器中存储的cookie

Spring实战 - 实现自动登录的功能

十一Django的cookie和session

Tomcat 会话 cookie 不会过期