Session
一. 概念:
服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。HttpSession
二. 快速入门:
-
获取HttpSession对象:
HttpSession session = request.getSession(); -
使用HttpSession对象:
Object getAttribute(String name) //获取
void setAttribute(String name, Object value) //存入
void removeAttribute(String name) //删除 -
实现
三. session 数据共享原理:
先问一个问题,上述案例中sessiondemo1 和 sessiondemo2 中创建出来的session是 同一个吗??
答案: 是同一个 下面请看分析:
一开始我们使用浏览器请求sessiondemo1中的资源
sessiondemo1 中的逻辑:为我们创建了一个session 对象(创建的session是有编号的)。session对象就放在tomcat服务器的内存中,如图中蓝色圈圈“session对象”。 然后我们使用setAttribute方法存入数据。
然后服务器需要给浏览器响应,于是服务器创建了一个cookie头,
name为JSESSIONID,value为上述session的id。把此cookie放入响应头中传递给浏览器,如下图。
(这也就是session要依赖于cookie的原因)
浏览器收到响应数据后,再用浏览器请求sessiondemo2中的资源,于是乎,浏览器的请求头就带着这个cookie,传递给了 sessiondemo2。
sessiondemo2 收到这个cookie,再顺着这个JSESSIONIS去找到服务器中session的位置。
所以两个session 是同一个session。
四. session 的细节
1. 当客户端关闭后,服务器不关闭,两次获取session是否为同一个?
当然不是啦,默认情况下客户端一关闭,cookie就消失了,session的id也就随之消失了,找不到了。
那我们如何让session的存在时间变长呢????
我们只需要把存session id 的那个cookie 的存在时间变长就行了 。可可以使用setmaxage 方法,实现如下:
2. 客户端不关闭,服务器关闭后,两次获取的session是同一个吗?
当然不是同一个了,服务器关闭后,内存都被销毁了,哪里还有什么session对象啊
但是为了防止数据丢失,tomcat有session钝化和活化的功能。
session的钝化:
- 在服务器正常关闭之前,将session对象系列化到硬盘上
session的活化:
- 在服务器启动后,将session文件转化为内存中的session对象即可。
所以 虽然session不是同一个,但是里面的值是一样的
3. session什么时候被销毁?
- 服务器关闭
- session对象调用invalidate() 。(自杀方法)
- session默认失效时间 30分钟。(可以在tomcat下的web.xml 中修改时长)
//选择性配置修改
<session-config>
<session-timeout>30</session-timeout>
</session-config>
五. session的特点
- session用于存储一次会话的多次请求的数据,存在服务器端
- session可以存储任意类型,任意大小的数据
session与Cookie的区别:
1. session存储数据在服务器端,Cookie在客户端
2. session没有数据大小限制,Cookie有
3. session数据安全,Cookie相对于不安全