前言
上一章,讲解了Cookie,本章介绍Session.
概念:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中HttpSession。
Session
基础
-
获取HttpSession对象:
HttpSession session = request.getSession(); -
使用HttpSession对象:
Object getAttribute(String name) ;
void setAttribute(String name, Object value);
void removeAttribute(String name) ; -
原理:
Session的实现是依赖于Cookie的,看案例。
默认给设置了Cookie属性。
同时,我们也可以看到,它在创建Cookie的时候,同时加上了path=/的设置,这就说明,在本项目下,不管访问哪个接口都能拿到Session。补充 HttpOnly说明:
另外,一定要注意,Cookie的创建不是在Session设置属性的时候才创建的,而是在获取Session的时候就创建了
HttpSession session = request.getSession();//获取session,并返回自定义生成的cookie
细节
-
当客户端关闭后,服务器不关闭,两次获取session是否为同一个?
默认情况下。不是,原因是,当客户端浏览器关闭后,cookie就注销了,再打开浏览器去请求接口,客户端是没有携带Cookie的,所以请求什么都拿不到,后端在获取属性的时候,同时给前端返回一个新的Cookie。
那你可能有疑问,浏览器不关闭的时候,第一次请求设置session,返回了Cookie,第二次携带这个Cookie请求另一个获取Session的接口,也就是上边的接口,会不会产生一个新的Cookie呢?答案是不会的。
当然,如果你想让浏览器重新打开获取的session为同一个,也是可以的:
可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存。Cookie c = new Cookie("JSESSIONID",session.getId()); c.setMaxAge(60*60); response.addCookie(c);
-
客户端不关闭,服务器关闭后,两次获取的session是同一个吗?
不是同一个,但是如果你用的tomcat,当tomcat正常关闭的情况下,会自动帮你把session序列化到硬盘,之后服务端启动,再反序列化到内存中,这就是tomcat对session的钝化和活化机制。
注意,如果你在idea中操作,那么这个钝化和活化机制也会有,但是再重启的时候,硬盘中整个缓存的session会被idea删除,所以就不会重新序列化
-
session什么时候被销毁?
服务器关闭;
session对象调用invalidate();
session默认失效时间 30分钟;
设置方法:
当然在这里也可以全局设置Cookie。
如果是在tomcat里的话,我们可以到tomcat\conf\web.xml文件下,找到:<session-config> <session-timeout>30</session-timeout> </session-config>