【问题标题】:How long do you keep session cookies around for?您将会话 cookie 保留多长时间?
【发布时间】:2011-02-11 18:51:39
【问题描述】:

我正在实现一个使用会话的网络应用程序。我使用 GWT 和应用程序引擎作为我的客户端/服务器,但我认为他们所做的事情与我使用 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 在两周内过期,那么我的用户会愉快地继续使用 web 应用程序,只是有一天浏览到我的网站并显示一个登录屏幕。我有哪些选择?我可以不为这个cookie设置过期时间吗?这样用户就必须明确退出,否则他们可以永远使用该应用程序而无需重新登录?

或者有更好的方法吗?我不记得像 Twitter 这样的网站曾经要求我重新登录。我好像永久登录了。他们只是设置了没有过期吗?

webapp 没有保护任何类型的高度敏感数据,所以我不介意留下一个不会过期的 cookie,但似乎必须有更好的方法?

这是我参考的教程:

http://code.google.com/p/google-web-toolkit-incubator/wiki/LoginSecurityFAQ

谢谢

【问题讨论】:

  • 通常情况下,我见过的很多网络应用程序都允许您勾选“让我保持登录”,这可以让您无限期地保持登录状态,或者在浏览器关闭后取消勾选。

标签: web-applications session gwt servlets


【解决方案1】:

HttpSession 在幕后已经得到了 cookie 的支持。检查浏览器 cookie 列表中名称为jsessionid 的cookie。此外,在获取实例时,您应该调用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 在大多数网络容器中的默认超时时间为 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?

【讨论】:

  • 好的,那么我实际上不需要在客户端做任何事情来支持这一点吗?我在应用程序引擎上进行了测试并且工作正常,但是在我关闭浏览器后会话不会保留,即使我在 web.xml 中放置了一个明确的会话超时持续时间。我想这并不重要,因为第二部分“让用户登录我的网站几个月”应该涵盖它?谢谢
  • 没错。当您关闭网络浏览器时,所有没有年龄的 cookie 都将被丢弃。您需要提供自己的 cookie,只要您想保持更长时间的持久性。
  • 好吧,这是有道理的——但是我很困惑如何像在其他问题答案中那样立即进行自动登录?当用户重新启动他们的浏览器时,jsessionid 被清除。所以下次重新启动时,浏览器将转到 www.mysite.com 并且 not 看到它有 jsessionid。因此,服务器将为页面提供服务,就好像用户没有经过 身份验证一样。它将要求客户端现在返回服务器以告诉它用户实际上已通过身份验证。浏览器没有办法在第一次演示时发送我自己的 cookie 吗?将在原始 Q 编辑中详细说明,谢谢!
  • 其实我会单独问,因为你回答了我原来的问题,谢谢!
  • 好的,在这里发布了后续,我想我已经拥有了一切,但如果你能抽查一下就好了,可怕的东西!:stackoverflow.com/questions/2704961/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-31
  • 1970-01-01
  • 1970-01-01
  • 2017-04-11
  • 2012-02-26
  • 2016-11-11
  • 1970-01-01
相关资源
最近更新 更多