1.概念
session时服务器会话技术,在一次会话的多次请求间共享数据,将数据保存在服务端的对象HttpSession中,是一个域对象
2.使用
HttpSession接口中有几个方法:
- void setAttribute(String var1, Object var2);
- Object getAttribute(String var1);
- void removeAttribute(String var1);
以下是使用的具体过程:
输出结果为hello session
在这里提一下req.getSession()
HttpSession为一个接口,且没有任何实现类,获取session是通过request获取
来看一下request内的方法
HttpSession getSession();
是一个空实现,我们再来打印一下session:
org.apache.catalina.session.StandardSessionFacade@17e49b93
结果发现session对象的创建与request和response一样,是由tomcat内部创建
在这里列出getSession()的用法:
-
有参:true或false
- true:HttpServletRequest.getSession(ture) :参数为true时,若存在会话,则返回该会话,否则新建一个会话
- false:参数为false时,如存在会话,则返回该会话,否则返回NULL
-
无参:HttpServletRequest.getSession()和 HttpServletRequest.getSession(ture) 是一个意思
3.原理分析
在第一次获取session时,是没有cookie的,服务器在内存中新建一个session对象,这个对象有唯一一个ID,随后做出响应,发送一个cookie,客户端接收到cookie后保存,在下一次访问服务器时,通过请求头cookie:JSESSIONID=4B449EFE4EBD4251225BDABFBE6BD78F
将session的id发送给服务器,服务器会自动识别id,查看内存中是否有和id符合的session对象
我们通过抓包来验证:
显示并没有错误,从而我们可以得出结论:
session是依赖于cookie的,也进而证明了两次请求中的session是同一个对象
4.细节
1.客户端关闭,服务端未关闭,默认情况下两次获取的session对象不是同一个,客户端关闭,代表一次会话结束,再次获取就没有cookie头了
解决办法:
HttpSession session = req.getSession();
Cookie c = new Cookie("JESSIONID",session.getId());
c.setMaxAge(60*60);
resp.addCookie(c);
2.客户端不关闭,服务器关闭,两次获得的session不是同一个,但是要确保数据不丢失,解决:
- session钝化:在服务器正常关闭之前,将session对象序列化到硬盘上
- session活化:在服务器启动后,将session文件转化为内存中的session对象
tomcat已经将上述解决办法实现了,注意是使用本地tomcat,idea上的tomcat只会
完成钝化过程,并不会完成活化过程
3.session销毁
- 服务器关闭
- session对象调用invalidate()
- session默认失效时间30分钟
可以在tomcat的conf文件夹找到web.xml
自定义编辑即可
4.session特点:
- session用于存储一次会话的多次请求的数据,存在服务器端(重定向可以使用)
- session可以存储任意类型,任意大小的数据