Session:服务器端会话技术
-
概念:
*服务器端会话技术,(与Cookie不同)是将数据保存在服务器端的对象中,即存于HttpSession对象中 -
快速入门:
- 获取HttpSession对象:
*HttpSession session = request.getSession(); - 使用HttpSession对象操作数据:
- 写入数据:void setAttribute(String name, Object value)
- 读取数据:Object getAttribute(String name)
*默认Session存活时间也是一次会话,会话结束则Session自动被销毁
- 获取HttpSession对象:
-
原理:
*Session的实现是依赖于Cookie的。
*当服务的资源SessionDemo1创建HttpSession对象时,会将其存放在服务器,并且将其存放地址通过响应头
Cookie的方式JSESSIONID=3E5F8A202E7EB21EF2C86A13B1DF34B4返回给客户端;当再次发起请求SessionDemo2时,
请求头中会包含Cookie头,且包含HttpSession对象的地址信息;
故SessionDemo2再次获取到的HttpSession就是初始创建的那个对象,即保证了对象的唯一性。 -
细节:
- 客户端关闭,服务器端不关闭,则两次获取的Session是同一个吗?
*默认情况下,不是同一个;因为客户端关闭意味着本次会话结束,所以再次发起会话请求时不再包含
Session的地址于cookie头中;所以服务器端会再次创建一个Session对象
*要想保持为同一个,则可以在创建Session对象后,再新建一个Cookie,键为JSESSIONID,值为新建的
Session对象的IP地址;然后设置Cookie的最大存活时间,让cookie持久化保存。 - 客户端不关闭,服务器端关闭,则两次获取的Session是同一个吗?
*不是同一个,就算地址一样,也是巧合。因为服务器关闭,则位于服务器端的session对象也会被销毁;
所以就算Cookie请求头中包含Session的IP,则也不再有该Session对象了。
*须注意的一个问题:
*要确保服务器的数据不丢失
* Session的钝化(序列化)
*在服务器正常关闭之前,将session对象序列化到硬盘上
* Session的活化(反序列化)
*在服务器启动后,将session文件转化为内存中的session对象
*该操作,tomcat中能够自动完成服务器的钝化与活化;然而IDEA软件只能完成服务器的钝化,并不能正常活化
(原因是IDEA启动时,会先将钝化的数据所存放的文件夹删除,然后再重新建立该文件夹),
所以IDEA中关闭tomcat服务器后或导致服务器端数据丢失 - Session的失效时间(何时被销毁)?
- 服务器关闭时
- session对象调用public void invalidate()方法
- session默认失效时间 30分钟
可以在tomcat项目中更改web.xml配置文件:
30
- 客户端关闭,服务器端不关闭,则两次获取的Session是同一个吗?
-
session的特点
- session用于存储一次会话的多次请求的数据,存在服务器端
- session可以存储任意类型的数据,无大小限制
*Session与Cookie的区别
1. session存储数据在服务器端,而Cookie存于客户端
2. session没有数据大小限制,Cookie有
3. session数据相对安全,cookie相对不安全