2010-04-24 95 views
5

我正在实现一个使用会话的Web应用程序。我使用GWT和应用程序引擎作为我的客户端/服务器,但我认为他们没有做任何与我使用PHP和Apache等不同的东西。你有多久保持会话cookie?

当用户登录到我的Web应用程序时,我正在使用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

通常,我见过的很多网络应用都允许您勾选“保持登录状态”,这会让您无限期登录,或者如果未打开,则在浏览器关闭后将您注销。 – Corey 2010-04-24 03:36:14

回答

3

HttpSession已经被一个cookie支持的幕后。检查名称为jsessionid的浏览器cookie列表。此外,在获得实例时,您应该在不使用false的情况下致电getSession(),否则在未创建时您可能冒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 configureable如下:

<session-config> 
    <session-timeout>10</session-timeout> 
</session-config> 

当超时是在分钟(在上述的例子因此,10分钟)。

如果您想提供一个(自动)“记住我这台电脑上”选项,然后你必须创建另一个的cookie 另一标识符。我之前发布了一个详细解答:Java - How do I keep a user logged into my site for months?

+0

好吧,所以我实际上不需要做任何事情来支持客户端呢?我在应用程序引擎上测试并工作,但关闭浏览器后,会话不会保留,即使我在web.xml中放置了显式的会话超时持续时间。 我想这并不重要,但因为第二部分'保持用户登录我的网站几个月'应该覆盖它? 谢谢 – user246114 2010-04-24 05:21:43

+0

这是正确的。当您关闭网页浏览器时,所有没有年龄的cookies都会被垃圾焚烧。你需要提供你自己的cookie,只要你想保持它持久一点。 – BalusC 2010-04-24 12:32:39

+1

好吧,这是有道理的 - 但然后我很困惑,你怎么可以做一个即时的automagic登录在你的其他问题的答案?当用户重新启动浏览器时,jsessionid被清除。所以在下次重新启动时,浏览器将转到www.mysite.com,*不*看到它有jsessionid。因此,服务器将为该页面提供服务,就好像用户未*认证一样。它将要求客户现在回到服务器,告诉它用户实际上已被认证。浏览器在第一次演示时是否有办法发送我自己的cookie?将在原Q编辑中详细说明,谢谢! – user246114 2010-04-24 14:02:20