session与cookie的区别与联系
session与cookie是在做项目中很常用的会话技术,session与cookie也是面试中被问到频率最高的问题,有一次我去面试,面试官就怼着我session与cookie一直问(头都大了),下面总结了一些关于session与cookie的区别与联系。
说到session与cookie,先说一下什么是会话技术:
由于http协议是无状态的协议,也就是说当一个用户在请求一个页面后再请求另一个页面时,http将无法告诉我们这两个请求是否来自于同一个用户,这就意味着我们需要有一种机制来跟踪和记录用户在该网站所进行的活动,这就是会话技术.简单来说,会话技术就是跟踪用户信息的技术.。会话技术也是一种维持同一个浏览器与服务器之间多次请求的数据状态的技术,它可以很容易的实现对用户登录的支持,记录该用户的行为,并根据授权级别和个人喜好显示相应的内容.。
好了,既然知道会话技术是什么了那再说一下session机制与cookie机制:
Session与cookie是目前最常用的两种会话技术.cookie是一种在浏览器端存储数据并以此来跟踪和识别用户的机制,而session是将信息存放在服务器端的会话机制。
COOKIE机制:
在程序中,会话跟踪是很重要的事情。理论上一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话。cookie就是来记录不同用户状态的一种机制,正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie.cookie实际上是一小段的文本信息,客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个cookie。客户端浏览器就会把cookie保存起来。当浏览器再次请求该网站时,浏览器把请求的网址连同该cookie一同提交给服务器。服务器检查该cookie,以此来辨别用户状态。服务器还可以根据需要修改cookie的内容。查看某个网站颁发的cookie很简单。在浏览器地址栏输入:JavaScript:alert(document.cookie)就可以了(需要有网才能查看)。JavaScript脚本会弹出一个对话框显示该网站颁发的所有cookie的内容。
cookie的内容主要包括:名字,值, 时间,路径和域。
路径就是跟在域名后面的URL路径,比如/或者/foo等等。
路径与域名合在一起就构成了cookie的作用范围。
如果不设置过期时间,则表示这个cookie的生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。
浏览器会话期间的cookie被称为会话cookie。会话cookie一般不储存在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。
如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间
注意:cookie功能需要浏览器的支持,如果浏览器不支持cookie,或者把cookie禁用了,cookie功能就会失效。
SESSION机制:
session,是另一种记录客户状态的机制,不同的是cookie保存在客户端浏览器中,而session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是session。客户端浏览器再次访问的时候只需要从该session中查找该客户的状态就可以了。
当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个 session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个 session id将被在本次响应中返回给客户端保存。
保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发给服务器。
由于cookie可以被人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面,附加方式也有两种,一种是作为URL路径的附加信息,另一种是作为查询字符串附加在URL后面,这两种方式对于用户来说是没有区别的,只是服务器在解析的时候处理的方式不同,采用第一种方式也有利于把session id的信息和正常程序