前段时间在一个项目中涉及到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. java 处理时间的各种方式——获取时间——时间格式化

    TimeUtil.java package com.snow; import java.text.DateFormat; import java.text.ParseException; import ...

  2. 初识缓存以及ehcache初体验

    1.缓存的意义 缓存机制就是将数据库中经常使用的数据取出放入内存中.程序调用时直接从内存中取,丌用每次使用  数据都訪问数据库,这样提高了效率. 2.缓存须要关注的问题 1)  缓存的更新 缓存中的数 ...

  3. Windows Phone开发(39):漫谈关键帧动画上篇

    原文:Windows Phone开发(39):漫谈关键帧动画上篇 尽管前面介绍的几种动画会让觉得很好玩了,但是,不知道你是否发现,在前面说到的一系列XXXAnimation中,都有一个共同点,那就是仅 ...

  4. J2EE请求和响应—Servlet

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

  5. 华为-on练习--小写字符数的统计显示

    主题: 手动输入一个字符串,只有小写字母,统计每个字符和输出频率中出现的串,输出.提示可以使用map 样例:输入:aaabbbccc 输出:a 3 b 3 c 3 分析: 看到后面的提示,简直就是不用 ...

  6. 如何设置一个activity透明(转)

    1.在AndroidManifest.xml文件中设置: ? 1 android:theme="@android:style/Theme.Translucent 此代码固定为全背景透明. 2 ...

  7. hdu4771 Stealing Harry Potter&#39;s Precious

    注意--你可能会爆内存-- 假设一个直接爆搜索词-- 队列存储器元件被减少到-- #include<iostream> #include<map> #include<st ...

  8. Android该系统提供的服务--Vibrator(振子)

    Android该系统提供的服务--Vibrator(振子) --转载请注明出处:coder-pig Vibrator简单介绍与相关方法: watermark/2/text/aHR0cDovL2Jsb2 ...

  9. React Native环境配置

    React Native环境配置 史上最全Windows版本搭建安装React Native环境配置 配置过React Native 环境的都知道,在Windows React Native环境配置有 ...

  10. [Windows Phone] 地图覆叠层控制项(MapOverlay )

    原文:[Windows Phone] 地图覆叠层控制项(MapOverlay ) 前言 当使用地图时,我们可能需要定位一些座标图示或是绘制一些文字线条,这时可以在地图上加上覆叠层进行绘制,在 Wind ...