web实操9——session
概念
数据保存在服务器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也比较大一点。