- Session:服务器端会话技术
1. Session:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端
2. 使用步骤:
a. 获取HttpSession对象:
HttpSession hs = request.getSession();
b. 使用HttpSession对象:
* Object getAttribute(String name);
* void setAttribute(String name, Object value);
* void removeAttribute(String name);
-- 如果想要实现一次性效果,则在get方法获取完存储的对象后,应该使用remove方法清空该属性原有的值
3. 实现原理:
* Session的实现是依赖与Cookie实现的
* 实现步骤:
1. 当浏览器第一次请求服务器资源时,如果没有cookie信息,服务器创建一个Session对象
2. 在对第一次请求做出的响应中,会在set-cookie属性中添加键值对:JSESSIONID=Session对象id值
3. 该id值为服务器为创建的Session对象分配的id,用于找到该对象
4. 当浏览器解析到set-cookie属性时,下一次请求会在cookie属性中传送该键值对
5. 服务器解析后再通过request.getSession()创建对象时,就会返回该id值指向的Session对象
4. Session对象细节:
a. Session对象的生存周期:
1. 浏览器关闭,服务器不关闭:
-- 默认情况下,浏览器关闭后会话结束,清空cookie信息
-- 重新打开浏览器时,再次申请时,会由于没有cookie中的JSESSIONID字段而创建一个新的Session对象
* 如果需要访问同一个Session对象
-- 通过创建一个Cookie对象,设置cookie在客户端的存活时间,可以将该键值对保存在浏览器本地
-- 下次访问时可以携带已有Session对象的id值获取相同的Session对象
2. 浏览器不关闭,服务器关闭重启:
-- 默认情况下,服务器关闭重启会话结束,本地内存中的资源被释放清空
-- 浏览器继续访问时,由于服务器内存中没有该指定id值的Session对象,则创建一个新的Session对象,并更新id值
* 如果需要访问同一个Session对象:在服务器关闭前将Session对象序列化到硬盘上,重启后反序列化到内存中
-- 对于部署完成的项目(指在tomcat的webapp目录下),tomcat会自动完成该序列化和反序列化工作
-- 正常关闭tomcat服务器,会在work目录下保存该Session对象
-- 重新开启tomcat服务器后,会自动读取该文件并删除该文件在硬盘的保存
-- 在工作空间的项目(IDEA目录下),文件序列化(钝化)操作可以将Session对象保存在其out目录下的work目录中
-- 但是IDEA重启tomcat后,会首先删除out目录下的work目录,然后新建一个work目录,因此无法读取到该对象
3. Session对象销毁
* 服务器关闭
* 调用成员方法invalidate()销毁
* 服务器不关闭,默认30分钟后销毁
-- 在web.xml在可以修改默认配置
<session-config>
<session-timout>40</session-timeout>
</session-config>
5. Session对象特点:
a. 可以存储任意类型,任意大小的数据 -- Cookie大小有限制
b. 用于存储一次会话的多次请求的数据