今天想和大家分享一个关于 Session 的话题: 当浏览器关闭时, Session 就被销毁了?
我们知道 Session 是 JSP 的九大内置对象 (也叫隐含对象) 中的一个, 它的作用是可以保
存当前用户的状态信息, 初学它的时候, 认为 Session 的生命周期是从打开一个浏览器窗
口发送请求到关闭浏览器窗口, 但其实这种说法是不正确的! 下面就具体的去解释:
当用户第一次访问服务器 web 应用程序中支持 session 的某个程序的时候, 客户端 (浏览器) 的请求头 cookie 属性中没有 JSESSIONID 信息, 那么服务器接收到请求后执行了 getSession()方法, 首先会判断是否有 JSESSIONID, 如果不存在的话, 就只姐创建一个新的 Session, 存在的话就会通过 jSESSIONID 取出对应的 Session.
再详细些:
当一个 Session 开始时, Servlet 容器会创建一个 HttpSession 对象, 那么在 HttpSession 对象中, 可以存放用户状态的信息
Servlet 容器为 HttpSession 对象分配一个唯一标识符即 Sessionid,Servlet 容器把 Sessionid 作为一种 Cookie 保存在客户端的 * 浏览器 * 中
用户每次发出 Http 请求时, Servlet 容器会从 HttpServletRequest 对象中取出 Sessionid, 然后根据这个 Sessionid 找到相应的 HttpSession 对象, 从而获取用户的状态信息
以上就是 Session 的运行机制, 但是还没有提到 Session 的生命周期, 再往下了解!
其实让 Session 结束生命周期, 有以下两种办法:
一个是 Session.invalidate()方法, 不过这个方法在实际的开发中, 并不推荐, 可能在强制注销用户的时候会使用;
一个是当前用户和服务器的交互时间超过默认时间后 Session 会失效
session.setMaxInactiveInterval(int seconds);// 秒为单位
我们知道 Session 是存在于服务器端的, 当把浏览器关闭时, 浏览器并没有向服务器发送
任何请求来关闭 Session, 自然 Session 也不会被销毁, 但是可以做一点努力, 在所有的
客户端页面里使用 JavaScript 中的 Windows.onclose 来监视浏览器的关闭动作, 然后向服务器发送一个请求来关闭 Session, 但是这种做法在实际的开发中也是不推荐使用的, 最正常的办法就是不去管它, 让它等到默认的时间后, 自动销毁
那么为什么当我们关闭浏览器后, 就再也访问不到之前的 session 了呢?
其实之前的 Session 一直都在服务器端, 而当我们关闭浏览器时, 此时的 Cookie 是存在
于浏览器的进程中的(存放在内存中), 当浏览器关闭时自然 Cookie 也就不存在了.
其实 Cookie 有两种:
一种是存在于浏览器的进程中(内存中)
一种是存在于硬盘上
而 session 的 Cookie 是存在于浏览器的进程中, 那么这种 Cookie 我们称为会话 Cookie,
当我们重新打开浏览器窗口时, 之前的 Cookie 中存放的 Sessionid 已经不存在了, 此时服务器从 HttpServletRequest 对象中的请求头里面没有检查到 sessionid, 服务器会再响应给客户端一个新的存有 Sessionid 的 Cookie 标识 (JSESSIONID) 到客户端的浏览器中, 此时对应的是一个新的会话, 而服务器上原先的 session 等到它的默认时间到之后, 便会自动销毁
PS:
按照以上定理, 我们可以设想一下, 如果我们获取了某一个用户的 JSESSIONID, 那么我们是不是可以通过某些方式来把这个 Session ID 写入到我们的浏览器中, 来伪造对方呢?
来源: http://www.bubuko.com/infodetail-3164746.html