文章目录
session原理讲解
- 在第一次获取session的时候,服务器会自动在内存中创建一个session对象,并把session的id即JSESSIONID通过cookie的形式返回给客户端
- 客户端在后续访问的时候,都会带着该cookie即JSESSIONID,来访问服务端,服务端根据该id找到对应的session对象,以此来保证一次会话内的多次请求找的都是同一个session
第一次响应,在响应头中可以看到:
在后续的访问中,都会带着该Cookie
session的使用
- 获取HttpSession对象:
HttpSession session = request.getSession();
- 使用HttpSession对象
//获得值
Object getAttribute(String name);
//放入值
void setAttribute(String name,Object value);
//删除值
void removeAttribute(String name);
当客户端关闭后,服务端不关闭,两次获取的session是否为同一个?
默认情况下,不是同一个,但是我们刚才已经讲过了session的原理,session是基于cookie实现的,所以我们可以给cookie设置存活时间,让该cookie持久化到硬盘上,那么即使关闭浏览器,session也会是同一个
//1.获取session
HttpSession session = request.getSession();
//为特定的cookie设置存活时间为1小时
Cookie c = new Cookie("JSESSIONID",session.getId());
c.setMaxAge(60*60);
response.addCookie(c);
客户端不关闭,服务器关闭后,两次获取的session是同一个吗
默认不是同一个,但是Tomcat提供了钝化活化的机制,该机制可以保证session的信息不会丢失,该机制的思想非常简单,就是在服务器关闭之前,把session对象序列化到硬盘上,重新打开服务器的时候,再通过反序列化读入内存,该机制序列化的目录是work
session失效时间
- 如果显示的调用方法invalidate(),或者关闭服务器,则session对象会被销毁
- 如果没有显示的关闭,那么session的默认失效时间是30分钟
- 可以配置session的默认时间
该配置文件再Tomcat的conf目录下,配置web.xml文件的标签:
或者再项目中的web.xml文件中覆盖掉该标签
Session的特点
- session用于存储一次会话的多次请求数据,存在服务器端
- session可以存储任意类型,任意大小的数据