cookie和session实现机制详解

1. 会话技术

会话跟踪是web中最常用的技术,用来跟踪用户的整个会话操作。由于http请求是无状态的,每次用户请求都需要创建一个连接,当请求结束时,连接就会被关闭。当下次请求时,服务器就无法得知与上次请求是否为同一用户。这时候就需要用到会话跟踪来对用户行为进行跟踪。常用的会话跟踪技术有Cookie和Session。Cookie在客户端记录用户信息,Session则在服务端记录用户信息来确定用户身份。

2. Cookie

1. 生成机制

Cookie其实就是由服务器发送给客户端的特殊信息,这些信息以文本文件的方式存放在客户端,然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息。

具体有一下步骤:

  • 当用户使用一个支持Cookie的网站的时候,用户会提供包括用户名在内的个人信息到服务器

  • 服务器向客户端回传相应的超文本的同时也会发回这些个人信息,当然这些信息并不是存放在HTTP响应体中,而是存放在HTTP响应头

  • 当客户端浏览器接收到来着服务器的响应之后,浏览器在特定的位置会存放这些信息。

  • 以后客户端再向服务器发送请求时都会把相应的Cookie放在HTTP请求头中,再次发回至服务器。

通信过程示意图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-au9vYVpl-1590127312710)(E:\work\learn\图片\timg.jpg)]

2. 理解

如果你把Cookies看成为http协议的一个扩展的话,理解起来就容易的多了,其实本质上cookies就是http的一个扩展。有两个http头部是专门负责设置以及发送cookie的,它们分别是Set-Cookie以及Cookie。当服务器返回给客户端一个http响应信息时,其中如果包含Set-Cookie这个头部时,意思就是指示客户端建立一个cookie,并且在后续的http请求中自动发送这个cookie到服务器端,直到这个cookie过期。如果cookie的生存时间是整个会话期间的话,那么浏览器会将cookie保存在内存中,浏览器关闭时就会自动清除这个cookie。另外一种情况就是保存在客户端的硬盘中,浏览器关闭的话,该cookie也不会被清除,下次打开浏览器访问对应网站时,这个cookie就会自动再次发送到服务器端。

客户端发送一个http请求到服务器端 服务器端发送一个http响应到客户端,其中包含Set-Cookie头部 客户端发送一个http请求到服务器端,其中包含Cookie头部 服务器端发送一个http响应到客户端

3. 生命周期

Cookie有两种存储方式,可以存储在浏览器内存中或者存储在磁盘里。存储在内存中的Cookie将随着浏览器的关闭而消息,而存储在磁盘中的Cookie则为永久存储,由过期时间控制

Cookie的maxAge决定着Cookie的有效期,单位为秒

Cookie中通过getMaxAge()方法与setMaxAge()方法来读写maxAge属性。如果maxAge属性为正数,则表示该Cookie会在maxAge秒之后自动消失。浏览器会将maxAge为正数的Cookie持久化,即写到对应的Cookie文件中。无论客户关闭了浏览器还是电脑,只要还在maxAge秒之前,登录网站时该Cookie仍然有效

如果maxAge为负数,则表示该Cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该Cookie即失效。maxAge为负数的Cookie,为临时性Cookie,不会被持久化,不会被写到Cookie文件中。Cookie信息保存在浏览器内存中,因此关闭浏览器该Cookie就消失了。Cookie默认的maxAge值为–1

如果maxAge为0,则表示删除该Cookie。Cookie机制没有提供删除Cookie的方法,因此通过设置该Cookie即时失效实现删除Cookie的效果。失效的Cookie会被浏览器从Cookie文件或者内存中删除

3. Session

1. 概念

Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。

如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。

2. 生命周期

Session保存在服务器端。为了获得更高的存取速度,服务器一般把Session存放在内存里。每个用户都会有一个独立的Session。如果Session内容过于复杂,当大量用户访问服务器时可能会导致内存溢出,所以Session里的信息应该尽量精简。

Session在用户第一次访问服务器的时候自动创建。需要注意的是只有访问Servlet、PHP、JSP等后端服务时才会创建Session,只访问HTML、JS等静态资源并不会创建Session。

ession生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。用户每访问服务器一次,无论是否读写Session,服务器都认为该用户的Session“活跃“了一次。

服务器设有默认的Session过期时间,到了时间服务器会把长时间没有活跃的Session从内存中删除。也可以自己自定义Session的过期时间。

3. Session与Cookie

虽然Session保存在服务器,对客户端是透明的,但是它的正常运行仍然需要客户端浏览器Cookie的支持。这是因为Session需要Cookie作为识别标识。HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一客户,因此当服务器创建Session时会向客户端浏览器发送一个名为JSESSIONID的Cookie,它的值为该Session的id,服务器根据每次客户端发送来的Cookie里的JSESSIONID来判断是否为同一用户。因此如果存储JSESSIONID的Cookie丢失,那么及时服务器的Session任未过期,也无法使用。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值