在 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的主要内容,如果未能解决你的问题,请参考以下文章