前段时间在一个项目中涉及到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. 在ubuntu安装Phabricator(转)

    前言: Phabricator是facebook团队进行codereview的一个工具,是基于php进行开发的.界面简洁优雅,是团队做代码评审的好帮手.个人认为,是当前最好的code review平台 ...

  2. 【python】按行切分文本文件

    python脚本利用shell命令来实现文本的操作, 这些命令大大减少了我们的代码量. 比如按行切分文件并返回切分后得到的文件列表,可以利用内建的split命令进行切分.为了返回得到的文件列表名,可以 ...

  3. POJ 1182 :食物链(并查集)

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 43526   Accepted: 12679 Description ...

  4. 【剑指offer】面试题35:第一个数字只出现一次

    def FirstNotRepeatingChar(string): hashStr = [0] * 256 for c in string: hashStr[ord(c)] += 1 for c i ...

  5. SignalR技术

    Asp.net SignalR快速入门 一.前言 之前半年时间感觉自己有点浮躁,导致停顿了半年多的时间没有更新博客,今天重新开始记录博文,希望自己可以找回初心,继续沉淀.由于最近做的项目中用到Sign ...

  6. Windows Phone开发(35):使用Express Blend绘图

    原文:Windows Phone开发(35):使用Express Blend绘图 上一节中我们简单扯了一下绘图指令,然而那也不是最简单的绘图法,今天,我再向大家推荐一种更好的绘图方案--Express ...

  7. Django - Django框架 简单介绍

    Django框架 简单介绍 本文地址: http://blog.csdn.net/caroline_wendy/article/details/29172271 1. 介绍 Django是一个开放源码 ...

  8. SharePoint发展 - 使用Session(代码更改webconfig)

    博客地址 http://blog.csdn.net/foxdave SharePoint启用Session能够使用Powershell,戳这里:能够改动webconfig. 本篇叙述的重点是通过fea ...

  9. WPF学习之绘图和动画--DarrenF

    Blend作为专门的设计工具让WPF如虎添翼,即能够帮助不了解编程的设计师快速上手,又能够帮助资深开发者快速建立图形或者动画的原型. 1.1   WPF绘图 与传统的.net开发使用GDI+进行绘图不 ...

  10. VC6 鼠标钩子 最简单样例

    Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的.而钩子是Windows系统中非常重要的系统接口,用它能够截获并处理送给其它应用程序的消息,来完毕普通应用程序 ...