前段时间在一个项目中涉及到cookie的存取,于是打算封装一个 cookie 的CRUD 。按理来说,这本身是一个很简单的问题,不注意的话简单的问题也有大坑。

 /**
* Set or get cookie ;parse to object
*
*@date 2015-04-11
*
*@author 飘摇的枫叶
*
*
*
*/
'use strict';
(function (window) {
// class2type refer to zepto.js $.type(obj) ## https://github.com/madrobby/zepto
var class2type = {},
toString = class2type.toString;
"Boolean Number String Function Array Date RegExp Object Error".split(" ").forEach(function(name) {
class2type["[object " + name + "]"] = name.toLowerCase();
}); var _qcookie = {
cookies: document.cookie,
get: function(name) {
return this.all()[name];
},
/*
*Set cookie
*
*@param {string} cookieName
*@param {string} cookieValue
* or
*@param {object} cookieObject{key:value}
*
*@param {object} options{path:'/demo';domain:'/';expire:new Date();secure:0|1}
*/
set: function(name, value, options) {
var opt = options || {};
if (!name) return;
if (type(name) === 'string' && value) {
this.write(name, value, opt);
} else if (type(name) === 'object') {
opt = value || {};
for (var k in name) {
this.write(k, name[k], opt);
}
}
// if (type(name) === 'string' && value) {
// str = encode(name) + '=' + encode(value) + '; ';
// } else if (type(name) === 'object') {
// opt = value || {};
// for (var k in name) {
// str += encode(k) + '=' + encode(name[k]) + '; ';
// }
// }
// if (opt.path) str += 'path=' + opt.path;
// if (opt.domain) str += 'domain=' + opt.domain;
// if (opt.expires) str += 'expires=' + opt.expires.toUTCString();
// if (opt.secure) str += 'secure';
// document.cookie = str;
},
all: function() {
return this.parse(this.cookies);
},
delete: function(name) {
var expires = new Date();
expires.setDate(expires.getDate() - 1);
document.cookie = name + "=" + this.get(name) + '; expires=' + expires.toUTCString();
},
write: function(name, value, opt) {
var str = encode(name) + '=' + encode(value);
if (opt.path) str += '; path=' + opt.path;
if (opt.domain) str += '; domain=' + opt.domain;
if (opt.expires) str += '; expires=' + opt.expires.toUTCString();
if (opt.secure) str += '; secure';
document.cookie = str;
},
parse: function(cookieStr) {
var obj = {};
var arrs = cookieStr.split(/ *; */); // Similar with the split(';') + trim()
var kv = [];
if (arrs[0] == '') {
return obj;
}
for (var i = 0; i < arrs.length; i++) {
kv = arrs[i].split('=');
obj[decode(kv[0])] = decode(kv[1]);
}
return obj;
}
} function encode(str) {
return encodeURIComponent(str);
} function decode(str) {
return decodeURIComponent(str);
} function type(obj) {
return obj == null ? String(obj) :
class2type[toString.call(obj)] || "object"
}
window.qcookie = _qcookie;
})(window)

  仔细一看你会发现这里面会有个很严重的问题,当不同域或者不同path的同名cookie 在读和删除的时候都会有问题 ,由于 cookie 的 domain , path 等属性是只写的,你读取到的两个cookie 结构可能是完全一样的,根本无法区分,类似这样,

由于我采用的是将cookie parse 一个对象, 当你只传一个name 的时候,第二个 'aaa' 必然会将第一个 'aaa' 的值给覆盖掉,,这个问题一时间还真没想到什么好的办法解决,又或者设计的时候压根就没有考虑过这个问题,因为实际项目中可能并不会出现这么看上去很傻X的使用场景,然而多了解一点总是极好的。

而删除的话,cookie 本身并没有提供删除的api , cookie 的删除完全是已写cookie的方式,加上一个失效时间,所以删除时指定path cookie 通过设置domain , path 还是可以做到的。

关于 cookie 使用中遇到的问题的更多相关文章

  1. cookie的使用

    cookie的使用 1.创建cookie对象: function addCookie(name, value) { var path = filterRoot(); var cookieString ...

  2. Django的具体操作(二)

    今日内容:用户登录以及分页的实现 views.py # 登录动作 def login_action(request): # 必须继承request if request.method == 'POST ...

  3. cookie 跨域访问的解决方案

    Cookie 同域单点登录  最近在做一个单点登录的系统整合项目,之前我们使用控件实现单点登录(以后可以介绍一下).但现在为了满足客户需求,在不使用控件情况下实现单点登录,先来介绍一下单点登录.    ...

  4. ASP.NET之Cookie(坑爹的Response.Cookies.Remove)(转)

      在web开发中Cookie是必不可少的 .NET自然也有一个强大的Cookie操作类,我们用起来也非常方便,不过在使用中我们会发现一个坑爹的事情Response.Cookies.Remove删除不 ...

  5. Cookie设置HttpOnly,Secure,Expire属性

    在eclipese中创建Web工程时,有个dynamic web module version选项,首先解释下这个选项的意思: http://stackoverflow.com/questions/3 ...

  6. get和post,session和cookie的一些说明

      1.GET和POST的区别 A. 从字面意思和HTTP的规范来看,GET用于获取资源信息而POST是用来更新资源信息. B. GET提交请求的数据实体会放在URL的后面,用?来分割,参数用& ...

  7. Cookie同域,跨域单点登录(转)

    Cookie 同域单点登录 最近在做一个单点登录的系统整合项目,之前我们使用控件实现单点登录(以后可以介绍一下).但现在为了满足客户需求,在不使用控件情况下实现单点登录,先来介绍一下单点登录. 单点登 ...

  8. ASP.NET之Cookie(坑爹的Response.Cookies.Remove)

    原文:ASP.NET之Cookie(坑爹的Response.Cookies.Remove) 在web开发中Cookie是必不可少的 .NET自然也有一个强大的Cookie操作类,我们用起来也非常方便, ...

  9. 会话Cookie及session的关系(Cookie & Session)

    会话Cookie及session的关系(Cookie & Session) 在通常的使用中,我们只知道session信息是存放在服务器端,而cookie是存放在客户端.但服务器如何使用sess ...

随机推荐

  1. Jersey的RESTful简单案例demo

    REST基础概念: 在REST中的一切都被认为是一种资源. 每个资源由URI标识. 使用统一的接口.处理资源使用POST,GET,PUT,DELETE操作类似创建,读取,更新和删除(CRUD)操作. ...

  2. Linux通过使用pdb简单调试python计划

    python自带的调试工具库:pdb # -*- coding:utf-8 -*- def func(num): s = num * 10 return s if __name__ == '__mai ...

  3. J2EE请求和响应—Servlet

    一.什么是Servlet? Servlet是执行Webserver上的一个特殊Java类.其特殊用途是响应client请求并做出处理.使得client与server端进行交互. 二.生命周期  Ser ...

  4. Ubuntu在下面LAMP(Linux+Apache+MySQL+PHP) 开发环境的搭建

    LAMP在行业是一个非常流行的词.此4字母代表Linux.Apache,MySQL和PHP. LAMP其高效.灵活的特点已经成为中小企业的首选. 它已经推出了快速构建LAMP道路. 1 在Ubuntu ...

  5. 完整的java字符串编码转换代码

    package book.String; import java.io.UnsupportedEncodingException; /** *//** * 转换字符串的编码 * @author joe ...

  6. 【oracle案件】ORA-19502,ORA-27072

    1.1.1. ORA-19502,ORA-27072 日期:2014-05-12 00:12 环境:试验机 [错误号] $ oerr ora 19502 19502, 00000, "wri ...

  7. TCP/IP-协议族----17、应用层简单

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGVrZXdhbmd6aQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  8. Cluster Table

    对簇表来说,总是要先创建簇段(cluster segment).然后将表关联到cluster segment里.由此可知,簇表也是虚拟表,没有对应的segment,簇表对应的是cluster segm ...

  9. #Windows Phone:在HTML5专案中,如何从Javascript传送字串到C#的APP端

    原文:#Windows Phone:在HTML5专案中,如何从Javascript传送字串到C#的APP端 #Windows Phone:在HTML5专案中,如何从Javascript传送字串到C#的 ...

  10. C++学习笔记33 转换操作符

    有时候,我们要转换为类类型和类类型,同时,这两个类继承关系不存在,这时候我们就需要一些所谓的转换操作符运营商. 一个简单的例子.类别A转换为int种类 #include <iostream> ...