概念
数据保存在服务器HttpSession对象里。
 
 session也是域对象,有setAttribute和getAttribute方法
快速入门

代码
获取session和塞入数据:
 
 获取session获取数据:
 
 请求存储:
 
 请求获取:
 
 数据正常打印:
 
结论
由于浏览器和服务器都没用关闭,所以上面相当于一次会话的两次请求。
 这时候把浏览器关闭,再直接访问demo2:
 输出null,说明范围确实是在一次会话的:
 一次会话中才能用session来共享数据。
 
原理分析

 竟然共享数据,那么两次请求获取的肯定是同一个session。
 那服务器是怎么确保这两个session是同一个的?
 
 !!!session是依赖于cookie的,cookie是通过请求头和响应头来实现的。
 1)第一次获取session,没有cookie会在内存中创建一个新的session对象,并且这个session对象有一个唯一的id值。
 2)给浏览器做响应的时候会发送一个响应头set-cookie:值是JSSONID=上面的session的Id。
 3)浏览器收到cookie头会把cookie信息存储到浏览器内部。
 4)下一次再访问当前项目里的其他资源的时候会携带这个cookie头,通过请求头cookie,值:JSSONID=session的Id值。
 5)服务器自动去获取这个cookie信息,然后根据cookie信息去查找内存中有没有一个id为带过来的id的session对象。
 6)找到了,getSession方法就找到了并返回。
通过抓包看
第一次:
 请求头没有请求信息,响应头有响应:
 
 第二次:
 请求头有:
 
 第一次第二次两个id值是一样的。
细节一

期望客户端关闭后session也能相同代码
设置一个cookie:
 并设置最大存活时间,比如设置成一个小时(60秒*60=1h),那么在这一个小时之内,浏览器不管是否关闭,获取的session都是同一个。
 
 我们先访问一次:
 
第一次访问session对象地址值为:
 
 浏览器关闭后再次访问:
 地址值一样:
 
细节二

 浏览器不关闭,浏览器访问一次后,服务器关闭,浏览器再访问一次,两次session地址值一样么:
服务器关了,内存被释放了,session对象在内存里,所以肯定会一同被销毁掉,下次我们打开服务器再创建,两次session的地址值很难一样。
两次不一样有什么问题:
 虽然对象不是同一个,但是要确保数据不丢失。
 钝化:序列化的过程
 活化:反序列化的过程
 
说明:
tomcat已经帮我们做好钝化和活化的事了,但是idea完成不了钝化和活化的操作,我们需要借用本地的tomcat。
tomcat演示
先把工作空间里的复制到tomcat下面:
 
 把这个复制一份放桌面然后把里面全部的内容打一个包:
 
 
 改个名字, 直接把.zip扩展名改成.war:
 
 
 然后直接把这个war包复制一份放到tomcat的webapps下:
 
 然后启动本地的tomcat:
 先访问demo1:
 
 控制台没有任何输出:
 
 再访问demo2:
 
 
 然后服务器正常关闭掉,看tomcat是否会把session对象序列化到硬盘上:
 到work目录下:
 work目录下存储的是程序运行中动态生成的数据,包括jsp转换的java文件,session被序列化后的文件。
现在什么都没有:
 
 然后服务器正常关闭:
 
 这边自动生成一个:
 这里面放的就是session对象。
 
 然后再服务器启动:
 这里自动消失了,他把对象又自动还原到内存中了。
 
 虽然这时候地址值不一样,但是里面内容sessionid值都是一样的。
 访问demo2:
 依然可以拿到里面的数据:
 
说明
idea只能钝化不能活化,没关系,因为将来部署项目不会在idea本地部署,都是在tomcat服务器里。
细节三——session的失效时间

解释说明
2)httpSession中session自杀的方法:
 一调用session就自己杀掉了自己。
 
 3)比如打开一个网站,登陆了,登录30分钟之内没做任何操作,这时候session会失效,会提示你重新登录。session如果30分钟内不活动就会被服务器自动删除掉。
 但是可以在tomcat里选择性配置的:
 web.xml是所有项目的父配置文件:
 
 打开,搜一下session的配置:
 可以修改想要的时间。
 
session的特点

 1)存的值是object,所以可以存任何类型。而且session没有大小的限制,想存多大存多大,只要你内存放得下。
 
 2)重定向是一次会话中两次请求,两次请求之间我们要共享数据,可以使用session也可以使用applicationContext,但是使用context范围太大了,所以session是我们经常采用的共享一次会话的数据。
 3)session一般存的数据比较大,session翻译过来是主菜的意思,cookie是小饼干,所以从他们体量来说session也比较大一点。