掌握 session与cookies生命周期

        很多同学在做web开发时总是对session和cookie犯迷糊,今天分析下cookies和seesion的生命周期和区别,加深下对

cookie和session的了解和认识。

        cookies和session都可以理解为存储用户信息的一个存储机制,不过一个是信息存储在客户端一个存储在服务端。

        cookie在我们的日常中也很常见,比如我们在淘宝搜索过某些内容,后期总会收到一些淘宝的相关内容的推送信息,因为获取到了我们的cookie中的内容,就会针对的推送相关的信息。我们理解的广义的cookie分发是通过扩展HTTP协议来实现的。

实现过程:

         用户通过浏览器发送请求后,在服务端生成私人数据cookie,存储些用户发送过的信息或者自定义的信息,通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie,存储在浏览器的内存中,下次再发送请求时,由浏览器按照一定的原则在浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上自动发送给服务器。cookie的内容主要包括:名字,值,过期时间,路径和域。路径与域一起构成cookie的作用范围。若不设置过期时间,cookie存储在浏览器内存上,存储这个cookie浏览器关闭时,则cookies自动销毁。而如果设置了过期时间,则保存在硬盘上,只要在有效期内访问都会有效,到期后自动销毁。

实现:

             在服务器端,将客户的数据打包为Cookie格式文件,一个cookie文件只能存储在一个键值对。
             Cookie file1 = new Cookie("关键字","用户的数据");
             ****cookie格式的文件保存的数据类型只能字符串类型
             将打包好的客户数据,推送到用户浏览器上
            response.addCookie(file1);
          设置有效期120秒           
            file1.setMaxAge(120)

            在用户使用同一个浏览器再次发送请求时,在服务器端接收浏览器自动推送过来的【所有】cookie文件
            Cookie fileArry[]= reqeust.getCookies()

存储:没有设置有效期时,存储在浏览器内存中,设置有效期后存储在用户的硬盘上;

安全:不安全,但是可以使用时可加密处理改进;

销毁:未设置有效期时,浏览器关闭,自动销毁,设置有效期后,有效期时间累积到到时间后自动销毁。如设置10分钟,十分钟后时间到大自动销毁;

共享:保存在浏览器内存中时只能同一个浏览器窗口使用,而保存在多个硬盘上,多个浏览器窗口可以共享;

优点:不占服务端内存,存储在浏览器上有一定的保密性;

缺点:1、保存的数据只能是String类型,无法保存复杂类型;

          2、存储在浏览器内存上很容易被回收,导致无法获取到数据。

    session可以理解将数据存储在服务端,常见就是我们所说的会话。

实现过程:

        用户第一次访问时根据用户需求,在服务端开辟一块内存session保存用户私人信息,然后将这块内存的sessionid发送通过cookie文件发送给浏览器,该cookie保存在浏览器内存中,也就是所说的会话cookie,用户关闭浏览器,则会话cookie销毁,用户使用浏览器再次发送请求时,会自动将内存的id发送给服务器,服务器首先检查这个客户端的请求里是否已包含了一个session标识(称为session id),如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(检索不到,会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id。session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。当然cookies也可以设置存活周期,但是cookies设置了存货周期就会存储在硬盘上,过期后自动销毁而session的生命周期在Tomcat关闭时,自动销毁session。

实现:

1.为当前用户,在服务器端开辟一个[私人储物柜]
HttpSession 私人储物柜= request.getSession()
2.将用户的私人数据添加到他的[私人储物柜]
私人储物柜.setAttriubte("关键字",[Object]私人数据);
3.将用户的私人数据从私人储物柜提取
Object 私人数据 = 私人储物柜.getAttribute("关键字")

[getSession方法实现细节]:
                    1.getSession方法负责向Tomcat索取当前用户的[私人储物柜]
                    2.Tomcat接收到这个命令时,索取当前浏览器推送的[id编号]
                    3.用户拥有[ID编号]
Tomcat 根据用户[ID编号]找到对应内存,并将这个内存管理
引用对象进行返回
HttpSession session= request.getSession();
用户没有[ID编号]
1)Tomcat为当前用户开辟一个全新内存
2)Tomcat为这块内存生成一个唯一[id编号]
3)Tomcat将[id编号]偷偷的通过Cookie文件输送到用户浏览器
4)Tomcat将这块内存的引用管理对象返回给用户
HttpSession session= request.getSession();
存活周期: 设置空闲方式
                        1、在web.xml文件中设置                           

                            <session-config>
                            <session-timeout>1</session-timeout>
                            </session-config>

                         2、通过api设置空闲时间,针对具体的内存来设置

                            HttpSesson session =request.getSession();
                            session.setMaxInactiveInterval(120);

存储:web服务器上

安全:存储在服务端不容易获取,安全性较高

销毁:达到设置空闲时间时,仍然没有访问则认为用户放弃了该session会自动注销该session,设置的空闲时间为重新计时如果设置为十分钟,空闲五分后有用户访问,则重新开始计时十分钟,在达到十分钟时还没有用户访问则该session就销毁了。Tomcat关闭时也销毁该session.

共享:具有相同的sessionid才可以访问

 


猜你喜欢

转载自blog.csdn.net/qq_24126893/article/details/80547815