会话技术_Session执行原理和细节
##Session
1.概念:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。HttpSession
2.快速入门:
1.获取Session对象
HttpSession sessiom = request.getSession();
2.使用HttpSession对象:
object getAttribute(String name )
void setAttribute(String name,Object value)
void removeAttribute(String name)
3.原理
(比如在服务器里边现在有两个资源,然后这两个资源里边都获取了Session对象,然后现在通过浏览器去访问SessionDemo1,然后得到一个响应,然后我又去请求SessionDemo2,然后又得了一个响应,这是两次请求两次响应,现在有个问题,我获取两个Session是不是同一个?其实他就同一个Session,那么是同一个session我们才可以在里共享数据,,那么服务器是怎么样确保这个两个session是同一个的,其实Session是依赖于cookie的,cookie是通过请求头和响应头实现的,也就说现在我通过这个request.getSession第一次来获取Session的时候,还没有cookie,会在内存中创建一个新的Session对象,比如说,现在有个Session对象,并且这个Session对象有一个唯一的ID,叫742938a4289,接下来,他给服务器做响应的时候,他会去发送一个响应的头,set-cookie:JSESSIONID=742938a4289,那么也就说他发送了一个cookie,名字是JSESSIONID是固定的,然后cooki的值的就是session对象的id,那么现在浏览器客户端收到了这么一个set-cookie头,他就会把这个cookie的信息存到浏览器的内部,下一次当再去访问当前这个项目里边的其他资源的时候,就会携带着这个cookie头,怎么带的呢,是通过一个请求头,通过这个头带去了JSESSIONID之后,服务器会自动地获取这么一个cookie信息,然后根据这个cookie信息去查找内存中没有没有id为这么长一串的session对象,getSession()方法就找到了这么一个对象,并且呢返回给这个session标记,所以这两次获取的session就是同一个对象,那么服务器就是通过cookie的方式确保session在一次范围内多次获取是同一个的。)
(抓包查看)
(可以看到,两个的JSESSIONID的值是一样的,可以得出结论,Session的实现是依赖于Cookie的)
4.细节:
1.当客户端关闭后,服务器不关闭,两次获取session是否为同一个(不是)
※默认情况下不是
(因为,客户端关闭了,意味着会话结束了,在获取就没有对应的cookie头了)
(第一次打印)
(关闭浏览器后重新打印)
※如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存
(第一次打印)
关闭浏览器再访问
2.客户端不关闭,服务器关闭,两次获取的session是同一个吗?
※不是同一个,但是要确保数据不丢失
服务器关了,session对象就被销毁了,服务器关闭,内存被释放了,这个session在内存里边肯定被销毁了,那么下一次再打开服务器,在创建session的时候,那么两次的session值很难一样,即使一样,他也是巧合,因为对象创建完毕之后,分配的那个地址值是有一些随机性的,所以呢基本上不可能是同一个)
启动服务器,然后请求查看session,关了在启动查看,发现不一样
(比如去京东购物,把要买的物品存放购物车,购物车对象是存在session里边的,我挑好后,准备结算,但是突然来了个重要的电话,接了几分钟,完事后,相当于我接电话的哪几分钟,京东服务器是关闭的,又重新启动了一次,因为这个服务器关了session对象也没了,那之前的数据也跟着没了,这样用户的体验就很差,所以要想办法确保数据不丢失
※session的钝化:
※服务器正常关闭之前将session对象序列化到硬盘上
※session的活化:
※在服务器启动后将session文件给他转化为内存中的session对象即可
(Tomcat已经自动帮我们做了这么一些事)本地可以,IDEA会把work删除在重建,就获取不到了
3.session的失效时间(什么时候被销毁)
1.服务器被关闭
2.session对象调用方法invalidate().调用就自杀了
3.session默认失效时间 30分钟
选择性配置修改
5.session的特点
1.session用于存储一次会话的多次请求的数据,存在服务器端
2.session可以存储任意类型,任意大小的数据
※session与Cookie的区别:
※session存储数据在客户端,而cookie在服务器端
※session没有数据大小限制,cookie有
※session数据安全,Cookie相对于不安全
主菜 小饼干