我正在实施一个使用会话的网络应用。我使用GWT和app引擎作为我的客户端/服务器,但我不认为他们做的事与我在PHP和apache等方面做的有什么不同。
当用户登录我的网络应用程序时,我正在使用HttpSession为他们启动会话。我得到这样的会话ID:
// From my login servlet:
getThreadLocalRequest().getSession(false).getId();
我将sessionId返回给客户端,并将它们存储在cookie中。我正在使用的教程在两周内将此cookie设置为“过期”:
Cookie.write("sid", theSessionId, 1000 * 60 * 60 * 24 * 14); // two weeks
这就是我感到困惑的地方:如果cookie在两周内到期,那么我的用户将愉快地使用webapp,只有一天浏览到我的网站并显示登录屏幕。我有什么选择?我可以为此cookie设置没有过期时间吗?这样用户就必须明确注销,否则他们可以永远使用应用程序而无需重新登录?
或者有更好的方法吗?我不记得像Twitter这样的网站要求我重新登录。我似乎永久登录。他们只是没有过期吗?
webapp不保护任何类型的高度敏感数据,所以我不介意留下一个没有过期的cookie,但似乎必须有更好的方法?
这是我引用的教程:
http://code.google.com/p/google-web-toolkit-incubator/wiki/LoginSecurityFAQ
由于
答案 0 :(得分:3)
HttpSession
是已经由cookie支持的幕后花絮。检查浏览器cookie列表中名称为jsessionid
的列表。此外,在获取实例时,您应该在没有getSession()
的情况下调用false
,否则在尚未创建NullPointerException
的情况下您可能会冒险,因此会返回null
。
当您登录时,通常会将登录的User
放入会话中。
User user = userDAO.find(username, password);
if (user != null) {
session.setAttribute("user", user);
} else {
// Handle error "Unknown username/password combo."
}
您可以通过检查其在会话中的存在来让您的web应用程序拦截登录的User
。例如,在Filter
中,您希望用它来阻止受保护的页面。
if (session.getAttribute("user") == null) {
response.sendRedirect("login");
} else {
chain.doFilter(request, response);
}
HttpSession
在大多数webcontainers中默认超时为30分钟。换句话说,它将在最后一次请求后30分钟到期。这可以在web.xml
中配置,如下所示:
<session-config>
<session-timeout>10</session-timeout>
</session-config>
超时以分钟为单位(在上例中为10分钟)。
如果您想提供(自动)“在此计算机上记住我”选项,则必须使用另一个标识符创建另一个 Cookie。我之前发布了一个详细的答案:Java - How do I keep a user logged into my site for months?