关于 cookie 使用中遇到的问题
前段时间在一个项目中涉及到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 使用中遇到的问题的更多相关文章
- cookie的使用
cookie的使用 1.创建cookie对象: function addCookie(name, value) { var path = filterRoot(); var cookieString ...
- Django的具体操作(二)
今日内容:用户登录以及分页的实现 views.py # 登录动作 def login_action(request): # 必须继承request if request.method == 'POST ...
- cookie 跨域访问的解决方案
Cookie 同域单点登录 最近在做一个单点登录的系统整合项目,之前我们使用控件实现单点登录(以后可以介绍一下).但现在为了满足客户需求,在不使用控件情况下实现单点登录,先来介绍一下单点登录. ...
- ASP.NET之Cookie(坑爹的Response.Cookies.Remove)(转)
在web开发中Cookie是必不可少的 .NET自然也有一个强大的Cookie操作类,我们用起来也非常方便,不过在使用中我们会发现一个坑爹的事情Response.Cookies.Remove删除不 ...
- Cookie设置HttpOnly,Secure,Expire属性
在eclipese中创建Web工程时,有个dynamic web module version选项,首先解释下这个选项的意思: http://stackoverflow.com/questions/3 ...
- get和post,session和cookie的一些说明
1.GET和POST的区别 A. 从字面意思和HTTP的规范来看,GET用于获取资源信息而POST是用来更新资源信息. B. GET提交请求的数据实体会放在URL的后面,用?来分割,参数用& ...
- Cookie同域,跨域单点登录(转)
Cookie 同域单点登录 最近在做一个单点登录的系统整合项目,之前我们使用控件实现单点登录(以后可以介绍一下).但现在为了满足客户需求,在不使用控件情况下实现单点登录,先来介绍一下单点登录. 单点登 ...
- ASP.NET之Cookie(坑爹的Response.Cookies.Remove)
原文:ASP.NET之Cookie(坑爹的Response.Cookies.Remove) 在web开发中Cookie是必不可少的 .NET自然也有一个强大的Cookie操作类,我们用起来也非常方便, ...
- 会话Cookie及session的关系(Cookie & Session)
会话Cookie及session的关系(Cookie & Session) 在通常的使用中,我们只知道session信息是存放在服务器端,而cookie是存放在客户端.但服务器如何使用sess ...
随机推荐
- ios UITableView 相关
1.tableView 实现的方法 无分组的cell #pragma mark - Table view data source - (NSInteger)tableView:(UITableView ...
- Android-IA Power Manager (S3)
Sleep and wake up
- hdu 4472 Count (递推)
Count Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- kafka解释三的具体:发展Kafka应用
一个.整体外观Kafka 我们知道.Kafka系统有三大组件:Producer.Consumer.broker . producers 生产(produce)消息(message)并推(push)送给 ...
- HDU ACM 2845 Beans->动态规划
意甲冠军: 1. 对于每一行是,对不相邻的同一时间数取: 2.它是相同的列,相邻行不能同时服用: 3.因此,我们可以得到状态方程:dp[i]=dp[i-1]>(dp[i-2]+a[i])?dp[ ...
- Nim博弈游戏
给定n堆石子,每次每人能从一堆石子中取若干个石子(不能不取),最后不能取石子者败 对于这个游戏,我们要判断的是,给定局势下,先手者胜还是败 设先手胜的局势为N-postion,先手败的局势为P-pos ...
- iOS 通过HEX(十六进制)得到一个UIColor的对象
inline static UIColor* getColorFromHex(NSString *hexColor) { if (hexColor == nil) { return nil; } un ...
- Java实现字符全阵列阵列
import org.junit.Test; public class AllSort { public void permutation(char[] buf, int start, int end ...
- Word001
C# Word 类库 2009-08-06 22:10 13470人阅读 评论(10) 收藏 举报 c#objectstring文档microsoftexcel using System;using ...
- C# 视频教程
http://www.cnblogs.com/kellen/tag/Silverlight/ http://www.lanmaodream.com/archives/244.html