Cookie和Session会话机制详细概念

本文介绍了HTTP协议中的会话管理机制,包括Cookie和Session的工作原理、结构、创建与传递过程,以及它们之间的区别与联系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考文献:https://blog.youkuaiyun.com/shenlei19911210/article/details/49510505

一:HTTP协议
        HTTP协议是无状态的协议,客户端只需要简单的向服务器请求下载某些文件,无论是客户端还是服务器都没有必要纪录彼此过去的行为,每一次请求之间都是独立的。
        开发人员发现如果能够提供一些按需生成的动态信息会使Web变得更加轻盈快捷,就像点播服务一样,采用按需加载的方式实现。这种需求一方面迫使HTML逐步添加了表单、脚本、DOM等客户端行为,另一方面在服务器端则出现了CGI规范响应客户端的动态请求,作为传输载体的HTTP协议也添加了文件上载、Cookie这些特性。其中Cookie的出现就是为了解决HTTP协议无状态的缺陷。至于后来出现的Session机制则是一种在客户端和服务器之间保持状态的解决方案。

  接下来用几个例子来描述一下Cookie和Session机制之间的差别和联系。假设一奶茶店推出满10赠1的积累活动,即凡是购买满10杯奶茶的客户可以免费获取一杯奶茶。这时需要一种方案来记录用户的消费数量,所以可能包含了一下几种方案:


  1、店长非常牛逼,能记住每位顾客的消费数量。这种做法就是协议本身是支持状态

  2、发给顾客一张卡片,上面记录着消费的数量。每次消费时,顾客出示这张卡片,将此次消费和以前的消费相联系起来。这种做法就是客户端中保持状态

  3、发给顾客一张会员卡,只记录卡ID号。每次消费时,顾客出示该卡片在机器上滴一下,软件通过指定ID号寻找到该用户的消费信息。这种做法就是服务端中保持状态



  由于HTTP协议是无状态的,而出于种种考虑也不希望使之成为有状态的,因此,第一种方案不符实际。具体来说Cookie机制采用的是在客户端保持状态的方案,而Session机制采用的是在服务器端保持状态的方案。

        从方案三中,我们可以看出采用服务器保持状态的方案,在客户端中需要存储一个标识。所以Session机制需要Cookie机制来达到传递和存储标识的目的。

 

二、什么是会话机制?

        在计算机术语中,会话是指一个终端用户与交互系统进行通信的过程。这个好理解,会话就是指客户端与服务器建立连接开始到访问结束的这个过程,称为一个会话。在这个会话过程中,客户端可以发起多个请求,访问多个Web资源。但在这个访问期间,无论发出多少次请求都是成为一次会话。

        这个过程就好比打电话,A给B打电话,接通之后会话开始,直到挂掉电话,此次会话就结束。在这个会话的过程中,A可能给B下达了多次指令或要求,但都是在此次会话过程中完成的。
 

        现在,我们了解了什么是会话后,我们来思考一个问题。一个浏览器访问一台服务器就会建立一个会话,倘若多台电脑的浏览器同时访问该服务器就会创建许多会话,由于HTTP协议的无状态性,多个请求操作之间服务器无法识别那个请求对应哪个客户,所以跟踪会话的Cookie技术诞生了。

 

        a)、小彩蛋:很多大佬都说Cookie的中文意思,却并没有介绍为何叫Cookie,而且Cookie的中文意思甜饼与会话跟踪半毛钱关系都没有,接下来我来说说会话跟踪技术为何叫Cookie。

        Cookie技术是网景公司的前雇员Lou Montulli在1993年3月的发明。之所以叫Cookie是因为该雇员在休息期间很喜欢吃公司的甜点---曲奇,所以人们远远的闻到了曲奇的味道,从而知道Lou Montulli要来了。

        Cookie的诞生就是为了解决HTTP协议无状态的缺陷。至于后来出现的Session机制则是为了让客户端与服务器之间保持状态而诞生的技术。 

        

三、会话跟踪技术 ------ Cookie

        通过上面的小彩蛋我们可以形象的理解,人们为什么会叫Cookie技术为会话跟踪技术了。通常,用于会话跟踪的Cookie叫做会话Cookie,在程序中,会话跟踪是很重要事情。因为,一名用户在一次访问过程中的所有请求都属于一次会话

        例如:在我没有登录淘宝时,我选购的商品会被保存在购物车中,当我发起新的请求或会话时,选购的商品数据由于无法储存而丢失。正是由于HTTP协议的无状态性,每一次新的请求都需要建立新的连接,这就意味着服务器无法从请求中跟踪会话。所以为了跟踪用户的会话,就必须要引入一种会话跟踪技术,即Cookie

        1)、什么是Cookie呢?

                Cookie是诞生于服务器保存在浏览器的“缓冲区”或“本地硬盘”中的片段文本信息。

 

        2)、Cookie的结构

        Set-Cookie: Name=Value;Domain=Domain_name;Expires=Date;Path=PATH;SecureSet-Cookie: Name=Value;Domain=Domain_name;Expires=Date;Path=PATH;Secure

                2.1、Name=Value

                    这是一个键值对,每一个Cookie都必须有的部分。Name是该Cookie的名称,Value是该Cookie的值。一个Cookie名是唯一的、不可更改,而值可以多次修改

 

                2.2、Expires=Date

                      Expires是一个只写变量,它的值Date确定了Cookie有效日期。该属性值必须以特定的语法格式来书写:星期几,DD-MM-YY HH:MM:SS GMT,例如:Feb, 13-Mar-2018 11:47:50。如果缺省时,则Cookie不会保存在用户的硬盘之中,而保存在浏览器的缓存区中,随着浏览器的关闭而消失。

 

                2.3、Domain=Domain_name

                        Domain是一个只写变量,它确定了那些Internet域中的Web服务器可以读取浏览器所存储的Cookie,即只有来自这个域的页面才可以使用Cookie中的信息。如果缺省时,默认为该Web服务器的域名。

 

                2.4、Path=The_path

                        Path属性值The_path定义了Web服务器上那些路径下的页面可获取服务器设置的Cookie。默认情况下,即缺省时,Path的属性值为当前Web项目路径中创建该Cookie的同类路径改写Path路径时,如果Path属性的值为“/”,则当前服务器中的所有Web应用上的所有Web资源均可读取该Cookie例如:百度帐号的百度贴吧和百度文库)。如果Path属性的值为访问资源路径,则在该路径前必须指明当前Web项目名。

 

                2.5、Secure

                        在Cookie中标记该变量,表明只有当浏览器和Web Server之间的通信协议为加密认证协议时,浏览器才向服务器提交相应的Cookie。当前这种协议只有一种,即为HTTPS。

 

        3)、Cookie的创建、传递与销毁

                a)、创建Cookie

                        当用户第一次访问时(或Cookie对象已经被销毁之后),服务器通过javax.servlet.http包中的Cookie接口创建Cookie对象。代码:Cookie cookie = new Cookie("key","value");

 

                b)、传递Cookie

                        服务器 → 客户端:服务器创建好Cookie之后,利用HTTP响应报文,通过response对象的addCookie()方法将Cookie设置Set-Cookie头字段中,将响应报文发送给浏览器。注意:Cookie对象一旦创建好了,就不能往其中添加别的键值对,但是可以修改其中的内容。代码:cookie.setValue();

 

                c)、保存Cookie

                        浏览器将服务器传递过来的Cookie进行存储,默认存储在浏览器的缓存区中,只要关闭浏览器,Cookie对象就会消失,也可以设定限时保存在本地硬盘中。并且允许开发者在JavaScript中使用document.cookie来存取cookie字符串进行操作。注意:Cookie保存位置和保存时间都在服务器中被创建。代码:cookie.setMaxAge(expiry);

                        expiry单位为秒,默认为-1;

  •                   expiry = -1:浏览器关闭后,cookie就失效。
  •                   expiry >  0:保存在本地硬盘中,浏览器关闭后不会失效,当到达指定时间之后自动失效。
  •                   expiry =  0:一生成,立马就失效,一般不设置。

 

                d)、获取Cookie

                      当用户对服务器发起访问请求时,浏览器会寻找浏览器缓存区或本地Cookie保存文件中是否有该访问站点的Cookie文件。如果有,浏览器会吧Cookie文件中的数据通过HTTP请求头信息报文发送给服务器,服务收到Cookie数据后,就会进行相应的操作。如果没有,则说明你是第一次访问该站点,服务器就会创建Cookie对象,设置数据,然后响应给浏览器进行保存。注意:Cookie是通过HTTP请求头信息进行传递的,浏览器的每一次访问请求都可以伴随Cookie传递。

【我是一张Cookie传递机制的照片】

 

                注意:从图中可以发现,创建时传递的Cookie头字段和访问时传递的头信息是不一样的,这是因为:

                         1、Cookie从服务器发送到客户端时,信息是完整的,其中包括数值,存储时间,访问路径等描述信息。

                         2、服务器获取Cookie时,只需要获取是那个Cookie对象,其数据值是多少就可以了,因为存储时间,访问路径这些是有浏览器解析的。

                也就是说,服务器只解析数据,服务器则需要解析数据描述信息。既然浏览器并不传递Cookie的描述信息,为什么在Java中提供了相应的get方法呢?其实,这个方法是服务器生成Cookie之后,尚未发送到客户端时使用的。

 

                    现在,我们知道了Cookie在浏览器传递的过程了,那么服务器如何获取浏览器传递过来的Cookie呢?在服务器中,我们可以通过HttpServletRequest对象的getCookies()方法获取数组。为什么是数组呢?因为一个Cookie对象只允许一个键值对,通常,在一次访问过程,传递的数据信息当然不止一个(也可以是一个,但是序列可以扩容),所以自然需要创建一个数组容器去存储获取的Cookie对象。注意:通常服务器从HTTP请求中获取Cookie对象时,需要进行判断Cookie数组是否为空,若不为空,则说明请求中传递了Cookie对象。若为空,则说明中请求中不包含Cookie对象,表名用户是初次访问(相对意义上来说是第一次访问)

                    获取Cookie对象:Cookie[] cookies=request.getCookies();

                    判断数组中是否有Cookie对象:if(cookies != null)

        

Cookie机制Cookie的使用是浏览器在访问服务器前,通过浏览器后台检查所有存储的Cookie,如果某个Cookie所声明的作用范围大于或等于所请求的资源路径,则把该Cookie附在HTTP请求头上发送给服务器。

 

总结:

        由于HTTP请求的无状态性,用户在没有登录的情况,用户只能获取本次访问的数据信息。当用户发送新的请求或会话时,数据会被刷新,无法存储;即使服务器将数据存储在服务器中的文本信息中(XML、Text),由于HTTP协议的无状态性,服务器无法识别用户对应那个文本数据。即,在未登录的情况,A和B在第一次操作中的数据被保存在服务器的文本数据中。之后,A又进行了访问,在没有会话跟踪时,由于Http的无状态性,在不传送关键请求参数的情况下,服务器无法识别上一次A和B的文本数据中那一个是A的数据。

        如果有了会话跟踪,服务器在A和B第一次访问时,生成A和B的Cookie对象关键属性索引值,绑定对应的文本数据。在Cookie存在访问期间,服务器通过该关键属性去识别那个是A和B的会话,然后获取上次请求的参数值。

        Ps:如果用户登录了怎么办?好说,都存储在数据库中,这样不管你什么时候访问,不管你用什么客户端或设备都可以获取你以往的数据。

 

 

四、会话状态技术 ------ Session

        Session称为“会话状态”,存储指定用户会话所需的属性及配置信息。这样,当用户在Web应用程序的页面跳转时,存储在Session域中的Session变量将不会丢失,而是在整个用户会话中一直存在下去。在计算机术语中,Session是指一个终端用户与交互系统进行通信的时间间隔。

        Session术语Session和网络协议相关联时,他隐含了“面向连接”和“保存状态”这两个含义。"面向连接"是指通信双方通信之前要先建立一个通信渠道,比如浏览器访问服务器,只有服务器接收到访问请求并反馈给浏览器之后,通信才能开始。“保持状态”则是指通信双方能够把消息关联起来,使消息之间能够相互识别依赖,比如:服务器能在一次请求中识别该用户,并获取上一次的登录状态。

        Session机制:Session在客户端和服务端中的处理过程:

                a)、服务器获取客户端的请求中Cookie是否包含Session标识 -- 称为Session Id的标识,名为JSESSIONID,该标识是由算法生成的不规则编号。

                b)、如果包含Session标识,则说明服务器已经为此客户端创建了Session,之后服务器通过该标识进行匹配,检索出对应的Session出来使用(如果检索不到,则可能会新建一个Session)。如果不包含Session标识,服务端会为此客户端创建一个Session并生成一个和此Session关联的不可重复的唯一值Session id,并保存在一个类似Map的集合中,最后将Session id通过响应返回到客户端中的Cookie保存。

                                                         【我是一张Cookie传递机制的照片】

        由于Session id是以Cookie为传输载体的,而Cookie可能会被人为禁止,此时必须要有一种机制能使Cookie被禁止时仍然能够吧Session id传递会服务器,经常使用的一中技术叫做URL重写,就是把Session id直接附加到URL路径的后面。附加方式分为两种,一种是作为URL路径的附加信息,表现形式为:http://....../xxx;jsessionid=xxx,另一种是作为查询字符串附加在URL后面,表现形式为:http://....../xxx?jsessionid=xxx,这两种方式对于用户来说是没有差别的,只是服务器在解析的时候处理的方式不同,采用第一种方式也有利于把session id的信息和正常程式参数区分开来。

        另一种技术叫做表单隐藏字段,就是服务器会自动修改表单,添加一个隐藏字段,以便表单提交时能够把Session id传递回服务器,但是这种技术目前以较少应用。

 

五:Cookie 和 Session的区别与联系

        Cookie是在服务器被创建的,通过响应头传递到浏览器中储存。默认情况下,会话结束时,Cookie就会失效。可以在Cookie被创建的时候设置他的有效期,之后Cookie会被保存在浏览器设定的默认存放Cookie目录下,到达指定时间之后自动失效。

          Session也是在服务器中被创建,在响应中通过Cookie传递Session标识到客户端存储起来,传递时也是通过Cookie传递Session标识,但Session保存在服务器中。

 

            意义上来说用户关闭浏览器表示会话结束,默认情况下,Cookie、Session已经失效。但实际上Session对象仍然保存在服务器中,这是因为大部分的Session机制都采用Cookie来保存Session id,所以关闭浏览器之后Cookie所保存的Session id就会消失,当再次开始新的会话时,没有之前的Session id自然也就找不到服务器中原来的Session。如果Cookie被保存在硬盘上,或修改浏览器发出的请求报文发送之前的Session id,依旧可以寻找到原来的Session

            正是由于浏览器的关闭不会导致Session被删除,由于Session是存在服务器的内存之中,随着用户量的增加,服务器的负荷越来越大,迫使服务器为Session设置了销毁时间。默认情况下,Session在服务器中的销毁时间为30分种,也就是说用户在这段时间没有进行操作时,服务器自动销毁Session对象。

 

有关Cookie和Session的介绍到这里也就结束了,以后回来有空可能会稍微修改

------  END  ------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值