一、cookie 起源

cookie 最早是网景公司的雇员 Lou Montulli 在1993年3月发明,后被 W3C 采纳,目前 cookie 已经成为标准,所有的主流浏览器如 IE、Chrome、Firefox、Opera 等都支持。

cookie 的诞生是由于 HTTP 协议的天生缺陷,HTTP 是一种无状态的协议,简单的 Request 和 Response 一旦请求/响应结束,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话,即服务器并不清楚是哪个客户端。

一些典型应用如 登陆/购物车 就无法实现了。比如,用户 A 在购物商城购买的商品都应该放在 A 的购物车内,不论是用户 A 什么时间购买的,这都是属于同一个会话的,不能放入用户 B 或用户 C 的购物车内,这不属于同一个会话。

基本的原理如图

二、cookie 操作

对 cookie 的操作包括如下

  1. 名称(Name)
  2. 值(Value)
  3. 域(Domain)
  4. 路径(Path)
  5. 失效日期(Expires)
  6. 安全标志(Secure)
  7. HttpOnly (仅服务器端)

注意,cookie 多数时候由服务器端创建,JS 也可以创建 cookie,但 HttpOnly 类型的 JS 无法创建。

浏览器提供的 cookie API (document.cookie)实在过于简陋,可以稍封装下,如以下采用setter/getter方式 cookie 函数就方便了许多

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/*
 * JS 写cookie和读cookie操作
 *
 * **取cookie**
 *   cookie(name)
 *
 * **写cookie**
 *   cookie(name, value)
 *   cookie(name, value, option)
 */
var cookie = function(name, value, option) {
    var doc = document
    if (value != undefined) { // set
        option = option || {}
        if (value === null) {
            value = ''
            option.expires = -1
        }
        var expires = ''
        if (option.expires && (typeof option.expires == 'number' || option.expires.toUTCString)) {
            var date = new Date
            if (typeof option.expires == 'number') {
                date.setTime(date.getTime() + (option.expires * 24 * 60 * 60 * 1000))
            else {
                date = option.expires
            }
            // for IE
            expires = '; expires=' + date.toUTCString()
        }
        var path   = option.path ? '; path=' + option.path : ''
        var domain = option.domain ? '; domain=' + option.domain : ''
        var secure = option.secure ? '; secure' ''
        doc.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('')
 
    else // get
        var cookieValue = null
        if (doc.cookie && doc.cookie != '') {
            var cookies = doc.cookie.split(';')
            for (var i = 0; i < cookies.length; i++) {
                var cookie = $.trim(cookies[i]).split('=')
                if ( cookie[0] == name && cookie.length > 1 ) {
                    try {
                        cookieValue = decodeURIComponent(cookie[1])
                    catch(e) {
                        cookieValue = cookie[1]
                    }
                    break
                }
            }
        }
        return cookieValue
    }
};

当然,还有更方便的 https://github.com/florian/cookie.js,提供了更多便捷函数。

  

三、cookie 类型

  1. 普通 cookie,服务器端和 JS 都可以创建,JS 可以访问
  2. HttpOnly cookie,只能由服务端创建,JS 是无法读取的,主要基于安全考虑
  3. 安全的 cookie (仅https),服务器端和 JS 都可以创建,JS 仅HTTPS下访问

比如,在新浪云上测试页面:http://snandy.sinaapp.com/php/cookie.php,我种了 3 个 cookie,分别是 c1, c2, c3

1
2
3
4
5
6
7
8
9
$d1 mktime(1,1,1,1,1,2018);
// 普通cookie
setcookie("c1""Jack"$d1);
 
// 安全的cookie,仅https,第6个参数
setcookie("c2""John"$d1, NULL, NULL, TRUE);
 
// HttpOnly cookie 第7个参数
setcookie("c3""Resig"$d1, NULL, NULL, NULL, TRUE);

用 Firefox 访问

我种的三个都有,saeut是新浪云种的。

在 firebug 控制台输入 document.cookie

可以看到,c2,c3 都是访问不到的。c2 是 安全的cookie,需要在https协议下访问,c3 则是 httpOnly 的,JS无法访问,这个需要注意。

把访问协议改成 https: https://snandy.sinaapp.com/php/cookie.php,firebug 切换到控制台再输入 document.cookie,可以看到 c2 就可以访问了

四、cookie 的坑

1. Cookie 太大或数量过多时页面访问报错,比如会出现如下提示

因此站点的 cookie 需要管理,不能随意种 cookie。另外尽量指定path,将cookie限定在指定范围内。

网站browsercookielimits.squawky.net,记录了各浏览器 cookie 大小

2. 保存中文时需要Unicode编码(encodeURIComponent),否则存的是乱码

http://www.cnblogs.com/snandy/p/5121293.html

HTTP状态管理机制之Cookie(转)的更多相关文章

  1. HTTP状态管理机制之Cookie

    一.cookie 起源 cookie 最早是网景公司的雇员 Lou Montulli 在1993年3月发明,后被 W3C 采纳,目前 cookie 已经成为标准,所有的主流浏览器如 IE.Chrome ...

  2. web状态管理机制

    引入:b/s(浏览器/服务器模式)区别于winform的是winform中只加载一次页面构造函数,而b/s中只要点击按钮或者其他涉及后台的操作都会调用后台代码.一般情况下为了防止服务器过载,b/s不会 ...

  3. 转载ASP.NET 状态管理Application,Session,Cookie和ViewState用法

    转载原地址 http://www.cnblogs.com/cuishao1985/archive/2009/09/24/1573403.html ASP.NET状态管理 APPlication,Ses ...

  4. 【HTTP】三、HTTP状态保持机制(Cookie和Session)

      前面我们提到HTTP协议的特点:无连接.无状态.无连接带来的时间开销随着HTTP/1.1引入了持久连接的机制得到了解决.现在来关注其"无状态"的特点.   所谓的无状态,就是指 ...

  5. JSP 状态管理 -- Session 和 Cookie

    Http 协议的无状态性 无状态是指,当浏览器发送请求给服务器的时候,服务器响应客户端请求.但是同一个浏览器再次发送请求给服务器的时候,服务器并不知道它就是刚才那个浏览器 session sessio ...

  6. HttpClient-03Http状态管理

    最初,Http被设计成一个无状态的,面向请求/响应的协议,所以它不能在逻辑相关的http请求/响应中保持状态会话.由于越来越多的系统使用http协议,其中包括http从来没有想支持的系统,比如电子商务 ...

  7. HttpClient4.3教程 第三章 Http状态管理

    最初,Http被设计成一个无状态的,面向请求/响应的协议,所以它不能在逻辑相关的http请求/响应中保持状态会话.由于越来越多的系统使用http协议,其中包括http从来没有想支持的系统,比如电子商务 ...

  8. redux沉思录:基于flux、状态管理、函数式编程的前端状态管理框架

    基于flux和reduce的通信和状态管理机制; 和数据库管理系统一样,redux是一个状态管理系统(或机制). const store = createStore( reducer, compose ...

  9. [原创]java WEB学习笔记28: 会话与状态管理Cookie 机制

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

随机推荐

  1. WPF实现无窗体鼠标跟随

    原文:WPF实现无窗体鼠标跟随 上次的弹力模拟动画实现后,我觉得可以把这个弄得更好玩一些,我们可以让小球实时跟随着鼠标,并且还可以让窗口完全消失,让小球在桌面上飞来飞去. 这只需要一些简单的修改就可以 ...

  2. OpenCV中的SVM參数优化

    SVM(支持向量机)是机器学习算法里用得最多的一种算法.SVM最经常使用的是用于分类,只是SVM也能够用于回归,我的实验中就是用SVM来实现SVR(支持向量回归). 对于功能这么强的算法,opencv ...

  3. 观察者模式(Observer Patterns)

    今天学习了观察者模式,做个总结,方便以后回想. 首先是定义:观察者模式就是定义对象之间一对多的依赖关系,当一个对象状态发生改变时,全部依赖他的对象都收到推送消息并自己主动更新做出改变. 我的理解:生活 ...

  4. iOS8互动的新通知

    iOS8一旦远程通知想必大家都很熟悉.不要做过多的描述在这里,直接推出iOS8交互式远程通知. 再看互动的通知电话,显示的形式                  如今来看一下详细实现方式 一.通过调用 ...

  5. 远程连接到vultr vps的mysql服务器

    实验环境 vultr centos 6.7 x64 1. 首先要打开远程 vps的3306端口用于 mysql的连接 修改/etc/sysconfig/iptables 文件,添加3306端口的支持 ...

  6. 【原创】leetCodeOj --- Candy 解题报告

    题目地址: https://leetcode.com/problems/candy/ 题目内容: Candy Total Accepted: 43150 Total Submissions: 2038 ...

  7. Foursquare 8.0 :聪明人给互联网公司上的流量转化课

    今年 5 月上线的 Swarm 虽然应用制作精良,但不免让人怀疑是 Foursquare一次失败的互联网公司服务越界和用户忠诚度试水.但非常快这群聪明人让我们发现事情并没有这么简单:他们给互联网公司们 ...

  8. crm采用soap删除记录

    //抽样 function demo() {     //操作记录id     var targetId = "A8A46444-BA10-E411-8A04-00155D002F02&qu ...

  9. 重新想象 Windows 8 Store Apps (10) - 控件之 ScrollViewer 特性: Chaining, Rail, Inertia, Snap, Zoom

    原文:重新想象 Windows 8 Store Apps (10) - 控件之 ScrollViewer 特性: Chaining, Rail, Inertia, Snap, Zoom [源码下载] ...

  10. defgen工具

    构造defgen档 由于 Oracle 和 SQL Server 中的数据类型不同.所以您必须建立数据类型转换.GoldenGate 提供了一个名为 DEFGEN 的专用工具.用于生成数据定义,当源表 ...