博客列表 >session与cookies的区别与联系

session与cookies的区别与联系

Whitney的博客
Whitney的博客原创
2020年03月14日 21:30:292927浏览

一、会话技术

由于http协议是无状态的协议,也就是说当一个用户在请求一个页面后再请求另一个页面时,http无法告诉我们这两个请求是否来自于同一个用户,这就意味着我们需要有一种机制来跟踪和记录用户在该网站所进行的活动,这就是会话技术。简单的说,会话技术就是跟踪用户信息的技术。会话技术也是一种维持同一个浏览器与服务器之间多次请求的数据状态的技术,它可以很容易的实现对用户登录的支持,记录该用户的行为,并根据授权级别和个人喜好显示相应的内容。

session 与 cookie 是目前最常用的两种会话技术。cookie是一种在浏览器端存储数据并以此来跟踪和识别用户的机制,而session是将信息存放在服务器端的会话机制。

二 、cookie机制

在程序中,会话跟踪是很重要的事情,理论上一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话。

cookie就是来记录不同用户状态的一种机制,正统的cookies分发是通过扩展http协议来实现的,服务器通过载http的相应头中加上一行特殊的提示以提示浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如javascript或者VBScript也可以生成cookie。

cookie实际上是一小段的文本信息,客户端请求服务器,如果服务器需要记录该用户状态,就是用response向客户端浏览器颁发一个cookie。客户端浏览器会把cookie保存起来。当浏览器再次请求该网站时,浏览器把请求的网址连同该cookie一同提交给服务器。服务器检查该cookie,以此来辨别用户状态。服务器还可以根据需求修改cookie的内容。查看某个网站颁发的cookie很简单。在浏览器的地址栏输入:javascript:alert(document.cookies)就可以了(需要有网才能查看)。JavaScript脚本会弹出一个对话框显示该网站颁发的所有cookie的内容。

cookies的内容主要包括:名字,值,时间,路径和域。

路径就是跟在域名后面的URL路径。

路径和域名合在一起就构成了cookie的作用范围。

如果不设置过期时间,则表示这个cookie的生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。

浏览器会话期间的cookie叫做会话cookie,会话cookie一般不存在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。

如果设置了过期时间,流浪器就会把cookie保存在硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过了设置的有效时间。

注意:cookie功能需要浏览器支持,如果浏览器不支持cookie,或者把cookie禁用了,cookie就会失效。

三、session机制

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

当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否包含了一个session标识——称为session id,如果已包含一个session id则说明以前已经为该客户端创建过session,服务器就按照这个session id 把session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id ,则为此客户端生成一个session和与此session相关联的session id,session id的值应该会是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将在本次响应中返回给客户端保存。

保存这个sessionid的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发给服务器。

由于cookie可以被人为的禁止,必须有其他机制在cookie被禁止时仍然能够把session id 传回服务器。经常被使用的一种技术叫做URL重写,就是把sessionid直接附加在URL路径的后面,附加方式也有两种,一种是作为URL路径的附加信息,另一种是作为URL查询字符串附加在URL后面,这两种方式对用户来说是没有区别的,只是在服务器解析的时候处理的方式不同,采用第一种方式也有利于把session id的信息与正常程序参数区分开来。还有一种方式叫做表单隐藏字段,就是服务器会自动修改表单,添加一个隐藏字段,以便在提交时能够把session id 传递会服务器。

为了在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id。

session的生命周期:

session保存在服务器端,为了获取更高的存取速度,服务器一般把session放在内存里。每一个用户都会有一个独立的session。如果session的内容过于复杂,当大量客户访问服务器的时候会造成服务器内存溢出。因此,session里的信息应该尽量精简。

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

session的有效期:

由于有越来越多的用户访问服务器,因此session也会越来越多。为了防止内存溢出,服务器会把长时间未活跃的session从内存中删除,这个时间就是session的超时时间,如果超过了超时时间没有访问服务器,session就自动失效了。

四、session 与cookies的区别与联系

区别:

1、存放位置:session保存在服务器,cookie保存在客户端

2、存放形式:session是以对象的形式保存在服务器,cookie以字符串的形式保存在客户端

3、用途:session适合做用户的身份验证,cookie适合保存用户的个人设置,爱好等

4、路径:session 不能区分路径,同一用户在访问一个网站期间,所有的session在任何一个地方都可以访问到;cookie中如果设置了参数路径,那么同一个网站下的cookie互相访问不到

5、安全性:cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,session较cookie更安全一些

6、大小及数量限制:单个cookie在客户端的限制是3k,就是说一个站点在客户端存放的cookie不能超过3k,不同浏览器所含的cookie最大个数不同,一般30-50个;一般认为session没有大小限制

联系:

session需要借助cookie才能正常工作,如果客户端完全禁止cookie,session将失效,因为session是由应用服务器维持的一个服务端的存储空间,用户在链接服务器时,会由服务器生成唯一的sessionid,用该sessionid 为标识存取服务端的session空间。而sessionid 存储在cookie中,用户提交页面时会将这个sessionid提交至服务器,来存取session数据。这一过程是不同开发人员干预的,所以一旦客户端禁用cookies,那么session也会失效。

五、session 的laji回收机制

session.gc_probability = 1;

session.gc_divisor = 1000;

session.gc_maxlifetime = 1440;

当超过了session的最大生命周期时,每1000个用户调用session_start()的时候,就执行一次session的laji回收机制。

六、Cookie存在哪里

如果设置了过期时间,Cookie存在硬盘里;

若果没有设置过期时间,Cookie存在内存里;

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议