Session_原理
服务器如何确保在一次会话范围内,多次获取的Session对象是同一个?
1. Session是依赖于Cookie实现的
2. 第一次获取Session,没有Cookie,会在内存中创建一个新的Session对象A
3. 服务器响应,发送给客户端一个cookie,set-cookie:JSESSIONID=A的ID值
4. 浏览器将这个cookie存入浏览器
5. 再次请求浏览器的时候将cookie随请求头带给服务器
6. 服务器根据cookie中的 set-cookie:JSESSIONID=A的ID值 ,查询内存中是否存在该ID值,如果存在,即可拿出
细节(常见的问题):
1. 当客户端关闭后,服务器不关闭,两次获取session是否为同一个?
1. 默认情况下不是的
2. 如果期望客户端关闭后,session也能相同,那么按照下面来做
Cookie c = new Cookie("JSESSIONID",session.getId());
c.setMaxAge(60*60);
response.addCookie(c);
2. 客户端不关闭,服务器关闭后,两次获取的session是同一个吗?
1. 肯定不是同一个,就算是同一个也是巧合
2. 虽然session不是同一个,但是一些网站需要重启关闭后也能够保持数据不能丢失,需要按照下面两个过程
1. session的钝化
* 在服务器正常关闭之前,将session对象序列化到硬盘中
2. session的活化
* 在服务器启动后,将session文件转为内存中的session
3. session的失效时间问题
1. 服务器被关闭
2. session对象调用invalidate()
3. session有一个默认失效时间:30分钟
* 选择性配置修改(在web.xml下)
<session-config>
<session-timeout>30</session-timeout>
</session-config>
session的特点
1. session用于存储一次会话的多次请求的数据,存在服务器端
2. session可以存储任意类型,任意大小的数据
session与cookie的区别:
1. session存储数据在服务器端,cookie在客户端
2. session没有数据大小限制,cookie有
3. session数据安全,cookie相对不安全