会话或 cookie 混淆 [英] Session or cookie confusion
问题描述
我在一些网站上看到用户登录他们的帐户然后关闭浏览器.
关闭并重新打开浏览器后,他们的帐户仍处于登录状态.
但有些网站不能这样做.
我对它是会话还是 cookie 感到困惑?
如果我希望我的网站像这样登录,我是否必须设置 session.setMaxInactiveInterval()
或 cookie.setMaxAge()
?
* 这个答案有严重缺陷,见评论.*
<小时>您的问题是关于会话跟踪.
[PART 1]:会话对象
HTTP 请求是单独处理的,因此为了保持每个请求之间的信息(例如,有关用户的信息),必须在服务器端创建一个 会话对象.>
有些网站根本不需要会话.用户无法修改任何内容的网站不必管理会话(例如,在线简历).在这样的网站上,您不需要任何 cookie 或会话.
创建会话:
在 servlet 中,使用来自 HttpServletRequest 对象的方法 request.getSession(true)
创建一个新的 HttpSession 对象.请注意,如果您使用 request.getSession(false)
,如果尚未创建会话,将返回 null.查看此答案了解更多详情.
设置/获取属性:
会话的目的是在每个请求之间保留有关服务器端的信息.例如,保留用户名:
session.setAttribute("name","MAGLEFF");//投掷String name = (String) session.getAttribute("name");
销毁会话:
如果长时间处于非活动状态,会话将被自动销毁.看看这个答案了解更多详情.但是您可以手动强制销毁会话,例如在注销操作的情况下:
HttpSession session = request.getSession(true);session.invalidate();
[PART 2] : 所以...加入黑暗面,我们有 COOKIES 吗?
饼干来了.
JSESSIONID :
每次使用 request.getSession()
创建会话时,都会在用户的计算机上创建 JSESSIONID cookie.为什么?因为在服务器端创建的每个会话都有一个 ID.您无法访问其他用户的会话,除非您没有正确的 ID.这个 ID 保存在 JSESSIONID cookie 中,并允许用户找到他的信息.查看此答案了解更多详情!
JSESSIONID 什么时候被删除?
JSESSIONID 没有过期日期:它是一个 会话 cookie.与所有会话 cookie 一样,它会在浏览器关闭时被删除.如果使用基本的 JSESSIONID 机制,那么在关闭浏览器并重新打开浏览器后,会话将无法访问,因为 JSESSIONID cookie 被删除了.
请注意,客户端无法访问会话,但仍在服务器端运行.设置 MaxInactiveInterval 允许服务器在会话不活动时间过长时自动使会话无效.
JSESSIONID的邪恶破坏
只是为了好玩,有一天我在一个项目中发现了这段代码.它用于通过使用 javascript 删除 JSESSIONID cookie 来使会话无效: