参考文档链接:http://mp.weixin.qq.com/s?__biz=MzAxODE2MjM1MA==&mid=2651552892&idx=1&sn=126a1d328c76b45f83925cb7032952d0&chksm=8025abbdb75222abb47c70dd5c6e536c30c00b566b73b18604ad4b40eec2e7e2344ebdd842b9&mpshare=1&scene=23&srcid=1024mKqR5M1pROm01X6hroXC#rd

背景

在HTTP协议的定义中,采用了一种机制来记录客户端和服务器交互的信息,这种机制称为cookie,cookie规范了服务器和客户端交互信息的格式、生存期、使用范围、安全性。

在Javascript中通过document.cookie来读取或设置这些信息。由于cookie多用于客户端和服务器之间进行通信,所以除了javascript以外,服务器语言也可以读取cookie

Cookie详解

Cookie在远程浏览器存储数据并以此跟踪和识别用户的机制,从实现上说,Cookie是存储在客户端上的一小段数据,浏览器*(客户端)通过HTTP协议和服务器进行Cookie交互。

Cookie独立于语言存在,严格地说,Cookie并不是由PHP,Java等语言实现的,而是这些语言对cookie进行间接操作,即发送HTTP指令,浏览器收到指令便操作Cookie并返回服务器。PHP可以使用setCookie()或setawcookie()函数设置Cookie。setCookie()最后一个参数HttpOnly设置后,JavaScript就无法读取到这个Cookie。

设置Cookie是需要注意:1函数有返回值,false失败,true成功2PHP设置Cookie不能立即生效要等到下一个页面才能看到(Cookie从服务器传给浏览器,下个页面浏览器才能把设置的Cookie传回给服务器)如果是JavaScript设置的,是立即生效的;3Cookie没有显示的删除函数,可以设置expire过期时间,自动触发浏览器删除机制。

Cookie是HTTP的一部分,即现发送或请求Cookie,才是data域,setCookie()等函数必须在数据之前调用,这个header()函数是相同的。不过也可以舒勇输出函数延迟脚本的输出,直到设置好所有的Cookie和其他的HTTP标头

Cookie通常用来存储一些不是敏感的信息,或者进行登录控制,也可以记住用户名,记住免密码登录、防止刷票。每个域名下允许Cookie是有限制的,一个域名的每个cookie限制4KB键值对形式存储

还有一种Cookie是Flash创建的,成为Flash Shard Object,又称Flash Cookie,即使清空浏览器所有隐私数据,这类顽固的Cookie还会存在硬盘上,因为它只受Flash管理,很多网站采用这种技术识别用户。

Cookie跨域,主要是为了统一应用平台,实现单点登录;需要使用P3P(Platform for Privacy Preferences)通过P3P使用户自己可以指定浏览器的隐私策略,达到存储第三方Cookie的目的,只需要在响应用户请求时,在HTTP的头信息中增加关于P3P的配置信息就可以了。

Cookie格式

Cookie保存信息是文本信息,在客户端和服务器交互过程中,cookie信息被附加在HTTP消息头中传递,cookie信息有键、值对组成

列:

Set-Cookie: key = value; Path=/

Cookie中存放的信息包含cookie本身属性和用户自定义属性,一个cookie只能包含一个自定义键、值对。Cookie本身属性有”Comment” 、”Domain”、”Max-Age”、”Path”、”Secure”、”Version”。

Comment属性是cookie产生对该cookie描述

Domain属性定义可访问的cookie域名,对一些网站,如果希望cookie可以在+子网站中共享,可以使用该属性。例如设置Domain为 .bigsite.com ,则sub1.bigsite.com和sub2.bigsite.com都可以访问已保存在客户端的cookie,这时还需要将Path设置为/。

Max-Age 属性定义cookie的有效时间,用秒计数,当超过有效期后,cookie的信息不会从客户端附加在HTTP消息头中发送到服务端。

Path 属性定义网站上可以访问cookie的页面的路径,缺省状态下Path为产生cookie时的路径,此时cookie可以被该路径以及其子路径下的页面访问;可以将Path设置为/,使cookie可以被网站下所有页面访问。

Secure 属性值定义cookie的安全性,当该值为true时必须是HTTPS状态下cookie才从客户端附加在HTTP消息中发送到服务端,在HTTP时cookie是不发送的;Secure为false时则可在HTTP状态下传递cookie,Secure缺省为false。

Version 属性定义cookie的版本,由cookie的创建者定义。

Cookie创建

创建cookie时如果不指定生存有效时间,则cookie只在浏览器关闭前有效,cookie会在服务器端和客户端传输,但是不会保存在客户机的磁盘上,打开新的浏览器将不能获得原先创建的cookie信息。

Cookie信息保存在本地时会保存到当前登录用户专门目录下,保存的cookie文件名中会包含创建cookie所在页面网站的域名,当浏览器再次连接该网站时,会从本机cookie存放目录下选出该网站的有效cookie,将保存在其中的信息附加在HTTP消息头中发送到服务器端,服务器端程序就可根据上次保存在cookie的信息为访问客户提供“记忆”或个性化服务。

Cookie除了可以在服务器端创建外,也可以在客户端的浏览器中用客户端脚本(如javascript)创建。客户端创建的cookie的性质和服务器端创建的cookie一样,可以保存在本地,也可以被传送到服务器端被服务器程序读取。

Cookie 基础知识

cookie 是有大小限制的,大多数浏览器支持最大为 4096 字节的 Cookie

由于 cookie 最终都是以文件形式存放在客户端计算机中,所以查看和修改 cookie 都是很方便的,这就是为什么常说 cookie 不能存放重要信息的原因。

每个 cookie 的格式都是这样的:cookieName = Vaue;名称和值都必须是合法的标示符。

cookie 是存在 有效期的。在默认情况下,一个 cookie 的生命周期就是在浏览器关闭的时候结束。如果想要 cookie 能在浏览器关掉之后还可以使用,就必须要为该 cookie 设置有效期,也就是 cookie 的失效日期。

cookie 有域和路径这个概念。域就是domain的概念,因为浏览器是个注意安全的环境,所以不同的域之间是不能互相访问 cookie 的(当然可以通过特殊设置的达到 cookie 跨域访问)。路径就是routing的概念,一个网页所创建的 cookie 只能被与这个网页在同一目录或子目录下得所有网页访问,而不能被其他目录下得网页访问

其实创建cookie的方式和定义变量的方式有些相似,都需要使用 cookie 名称和 cookie 值。同个网站可以创建多个 cookie ,而多个 cookie 可以存放在同一个cookie 文件中。

cookie 存在两种类型:①:你浏览的当前网站本身设置的 cookie ②来自在网页上嵌入广告或图片等其他域来源的 第三方 cookie (网站可通过使用这些 cookie 跟踪你的使用信息)

cookie 有两种清除方式:①:通过浏览器工具清除 cookie (有第三方的工具,浏览器自身也有这种功能) ②通过设置 cookie 的有效期来清除 cookie.注:删除 cookie 有时可能导致某些网页无法正常运行。

浏览器可以通过设置来接受和拒绝访问 cookie。出于功能和性能的原因考虑,建议尽量降低 cookie 的使用数量,并且要尽量使用小 cookie。

Cookie的使用

服务器端cookie的创建和再次读取功能通常由服务器端编程语言实现,客户端cookie的保存、读取一般由浏览器来提供,并且对cookie的安全性方面可以进行设置,如是否可以在本机保存cookie。

与cookie类似的另一个概念是会话(Session),会话一般是记录客户端和服务器端从客户端浏览器连接上服务器端到关闭浏览器期间的持久信息。会话一般保存在内存中,不保存到磁盘上。会话可以通过cookie机制来实现,对于不支持cookie的客户端,会话可以采用URL重写方式来实现。可以将会话理解为内存中的cookie。

Cookie 基本操作

对于 Cookie 得常用操作有,存取,读取,以及设置有效期;具体可以参照 JavaScript 操作 Cookie 一文;但,近期在前端编码方面,皆以Vue为冲锋利器,所以就有用到一款插件 vue-cookie,其代码仅30行,堪称精妙,读取操作如下:

set: function (name, value, days) {

    var d = new Date;

    d.setTime(d.getTime() + 24*60*60*1000*days);

    window.document.cookie = name + "=" + value + ";path=/;expires=" + d.toGMTString();

},

get: function (name) {

    var v = window.document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)');

    return v ? v[2] : null;

},

delete: function (name) {

    this.set(name, '', -1);

}

cookie 域概念

路径能解决在同一个域下访问 cookie 的问题,咱们接着说 cookie 实现同域之间访问的问题。语法如下:

document.cookie = “name=value;path=path;domain=domain“

一定的是同域之间的访问,不能把domain的值设置成非主域的域名。

session

Session即回话,指一种持续性的、双向的连接。Session与Cookie在本质上没有区别,都是针对HTTP协议的局限性而提出的一种保持客户端和服务器间保持会话连接状态的机制。Session也是一个通用的标准,但在不同的语言中实现有所不同。针对Web网站来说,Session指用户在浏览某个网站时,从进入网站到浏览器关闭这段时间内的会话。由此可知,Session实际上是一个特定的时间概念。

Session通过一个称为PHPSESSID的Cookie和服务器联系。Session是通过sessionID判断客户端用户的,即Session文件的文件名。sessionID实际上是在客户端和服务端之间通过HTTP Request 和 HTTP Response传来传去。sessionID按照一定的算法生成,必须包含在 HTTP Request 里面,保证唯一性和随机性,以确保Session的安全。如果没有设置 Session 的生成周期, sessionID存储在内存中,关闭浏览器后该ID自动注销;重新请求该页面,会重新注册一个sessionID。如果客户端没有禁用Cookie,Cookie在启动Session回话的时候扮演的是存储sessionID 和 Session 生存期的角色。Session过期后,PHP会对其进行回收。

session与cookie的区别:

1,session 在服务器端,cookie 在客户端(浏览器)

2,session 存在在服务器的一个文件里(默认),不是内存

3,session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果 浏览器禁用了 cookie ,同时 session 也会失效(当然也可以在 url 中传递)

4,session 可以放在 文件,数据库,或内存中都可以。

5,用户验证这种场合一般会用 session

因此,维持一个会话的核心就是客户端的唯一标识,即 session id

所以,总结一下:

Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;

Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。

 

posted on 2017-12-11 15:22  执候  阅读(231)  评论(0编辑  收藏  举报