常用的会话跟踪是Cookie和Session。Cookie是客户端记录信息再确认用户身份,而Session是通过服务器记录信息确认用户信息。
Cookie:
Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。
会话Cookie:没有设置Cookie的生命期,简而言之就是关闭浏览器窗口,Cookie就消失,这个时候Cookie一般保存在内存里面。若设置了过期时间的Cookie,一般会把Cookie保存在硬盘里面,只要在时间内,关闭再次打开浏览器都可以追踪到用户的信息。
Cookie原理:
由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上cookie,这样服务器就能通过cookie的内容来判断这个是“某位”了。大多数的应用都是用Cookie来实现Session跟踪的,第一次创建Session的时候,服务端会把HTTP协议告诉客户端,会在Cookie里面记录一个Session ID,以后每次请求都会把这个带有信息的ID发送给服务器,便能知道用户是谁。(若某个用户的浏览器禁用了Cookie怎么办呢?一般会使用URL重写技术来进行会话跟踪,就是每次HTTP交互时,URL后面都会附加一个 sid=xxx的参数,这样服务端便可以识别用户)
为什么有了Cookie还需要Session?
基于http协议的无状态特征,服务器根本就不知道访问者是“谁”。cookie虽然在一定程度上解决了“保持状态”的需求,但是由于cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更多的字节,并且保存在服务器,有较高的安全性。这就是session。 我们可以给每个客户端的cookie分配一个唯一的id,这样用户在访问时,通过cookie,服务器就知道来的人是“谁”。然后我们再根据不同的Cookie ID,在服务器上保存一段时间的私密资料,如“账号密码”等等。 总结而言:cookie弥补了http无状态的不足,让服务器知道来的人是“谁”;但是cookie以文本的形式保存在本地,自身安全性较差;所以我们就通过cookie识别不同的用户,对应的在session里保存私密的信息。
Cookie内容:
Cookie的内容包括:名字,值,过期时间,路径和域。路径和域一起构成Cookie的作用范围。
Set-Cookie: "name=value;domain=.domain.com;path=/;expires=Sat, 11 Jun 2016 11:29:42 GMT;HttpOnly;secure" 其中name=value是必选项,其它都是可选项。Cookie的主要构成如下:
name:一个唯一确定的cookie名称。通常来讲cookie的名称是不区分大小写的。
value:存储在cookie中的字符串值。最好为cookie的name和value进行url编码
domain:cookie对于哪个域是有效的。所有向该域发送的请求中都会包含这个cookie信息。这个值可以包含子域(如:yq.aliyun.com),也可以不包含它(如:.aliyun.com,则对于aliyun.com的所有子域都有效).
path: 表示这个cookie影响到的路径,浏览器跟会根据这项配置,像指定域中匹配的路径发送cookie。
expires:失效时间,表示cookie何时应该被删除的时间戳(何时应该停止向服务器发送这个cookie)。如果不设置这个时间戳,浏览器会在页面关闭时即将删除所有cookie;不过也可以自己设置删除时间。这个值是GMT时间格式,如果客户端和服务器端时间不一致,使用expires就会存在偏差。
max-age: 与expires作用相同,用来告诉浏览器此cookie多久过期(单位是秒),而不是一个固定的时间点。正常情况下,max-age的优先级高于expires。
HttpOnly: 告知浏览器不允许通过脚本document.cookie去更改这个值,同样这个值在document.cookie中也不可见。但在http请求仍然会携带这个cookie。注意这个值虽然在脚本中不可获取,但仍然在浏览器安装目录中以文件形式存在。这项设置通常在服务器端设置。
secure: 安全标志,指定后,只有在使用SSL链接时候才能发送到服务器,如果是http链接则不会传递该信息。就算设置了secure 属性也并不代表他人不能看到你机器本地保存的 cookie 信息,所以不要把重要信息放cookie就对了服务器端设置
session:
访问服务器某个网页的时候,会在服务器端的内存里开辟一块内存,这块内存就叫做session,而这个内存是跟浏览器关联在一起的。这个浏览器指的是浏览器窗口,或者是浏览器的子窗口,意思就是,只允许当前这个session对应的浏览器访问,就算是在同一个机器上新启的浏览器也是无法访问的。而另外一个浏览器也需要记录session的话,就会再启一个属于自己的session
Session原理:
HTTP协议是非连接性的,关闭浏览器后,链接就断开了,就没有任何机制去记录取出后的信息。而当需要访问同一个网站的另外一个页面时,这个时候取出来的信息,就读不出来了。所以必须要有一种机制让页面知道原理页面的session内容。
Session如何与浏览器一一对应?
当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识(称为session ID),如果已包含则说明以前已经为此客户端创建过session,服务器就按照session ID把这个session检索出来使用(检索不到就新建一个),如果客户端请求不包含session ID,则为此客户端创建一个session并且生成一个与此session相关联的session ID(session ID的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串)。这个session ID将被在本次响应中返回给客户端保存。
Session的两种实现方式:
通过Cookie实现:就是把session的id 放在cookie里面(),当允许浏览器使用cookie的时候,session就会依赖于cookies,当浏览器不支持cookie后,就可以通过第二种方式获取session内存中的数据资源。 URL重写:response.encodeURL()/encodeURL()