你有多长时间保持会话cookie?

时间:2010-04-24 03:33:19

标签: web-applications session gwt servlets

我正在实施一个使用会话的网络应用。我使用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

由于

1 个答案:

答案 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?