会话技术_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)
会话技术_Session执行原理和细节
会话技术_Session执行原理和细节
会话技术_Session执行原理和细节
会话技术_Session执行原理和细节
会话技术_Session执行原理和细节
            3.原理
会话技术_Session执行原理和细节
              (比如在服务器里边现在有两个资源,然后这两个资源里边都获取了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在一次范围内多次获取是同一个的。)

              (抓包查看)
会话技术_Session执行原理和细节
会话技术_Session执行原理和细节
会话技术_Session执行原理和细节
              (可以看到,两个的JSESSIONID的值是一样的,可以得出结论,Session的实现是依赖于Cookie的)

            4.细节:
             1.当客户端关闭后,服务器不关闭,两次获取session是否为同一个(不是)
                ※默认情况下不是
              (因为,客户端关闭了,意味着会话结束了,在获取就没有对应的cookie头了)
              (第一次打印)
会话技术_Session执行原理和细节
              (关闭浏览器后重新打印)
会话技术_Session执行原理和细节
                ※如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存
会话技术_Session执行原理和细节
              (第一次打印)
会话技术_Session执行原理和细节
              关闭浏览器再访问
会话技术_Session执行原理和细节

              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分钟
                        选择性配置修改
会话技术_Session执行原理和细节

            5.session的特点
              1.session用于存储一次会话的多次请求的数据,存在服务器端
               2.session可以存储任意类型,任意大小的数据
                ※session与Cookie的区别:
                   ※session存储数据在客户端,而cookie在服务器端
                   ※session没有数据大小限制,cookie有
                   ※session数据安全,Cookie相对于不安全
主菜 小饼干