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