MooTools的Cookie类太“自作聪明”了
作者:Fdream 来源:Fdream博客 时间:2008-11-13 12:59:00
没注意到MooTools的Cookie类在写的时候自己做了一次encode,在读的时候做了一次decode,在一般的情况下,这个不会有什么问题。但是想一下特殊的情况,如果你在服务器端写Cookie的时候没有encode,那么读的时候是不是会乱掉?当然了,服务器端代码写Cookie一般还是会encode的。但是问题是这样的,如果你要写一个很长的Cookie,中间有很多内容,你先把这些内容那个encode,然后用$作为分隔符把这些项连接起来,再用服务器端代码写入到Cookie里面。好,你现在的Cookie的值可能是这样的:
参考代码:
// 这个cookie的内容有三项,分别为:
// Fdream——decode之后为——Fdream
// http%3A%2F%2Fooboy.net——decode之后为——http://ooboy.net
// %25%25%24%24——decode之后为——%%$$
youkey=Fdream$http%3A%2F%2Fooboy.net$%25%25%24%24
这些是服务器端写进去的,现在我们用MooTools的Cookie类来读,那么返回的内容将是:
参考代码:
youkey=Fdream$http://ooboy.net$%%$$
非常遗憾的是,我们的分隔符$这个时候已经完全被混淆了——最后那两个$不是我们的分隔符!
怎么办?改分隔符?麻烦,说不定以后还是会碰到类似的问题。不如直接改MooTools的Cookie类来得爽快,修改的部分见下面的注释:
参考代码:
var Cookie = new Class({
Implements: Options,
options: {
path: false,
domain: false,
duration: false,
secure: false,
// 新添加的选项,读取时是否decode,
// 为保持和MooTools的原来行为一致,默认为true
decode: true,
// 新添加的选项,写入是是否encode,
// 为保持和MooTools的原来行为一致,默认为true
encode: true,
document: document
},
initialize: function(key, options) {
this.key = key;
this.setOptions(options);
},
write: function(value) {
// 如果使用encode,对value进行encode,否则不encode
if (this.options.encode) value = encodeURIComponent(value);
if (this.options.domain) value += '; domain=' + this.options.domain;
if (this.options.path) value += '; path=' + this.options.path;
if (this.options.duration) {
var date = new Date();
date.setTime(date.getTime() + this.options.duration * 24 * 60 * 60 * 1000);
value += '; expires=' + date.toGMTString();
}
if (this.options.secure) value += '; secure';
this.options.document.cookie = this.key + '=' + value;
return this;
},
read: function() {
var value = this.options.document.cookie.match('(?:^|;)\\s*' + this.key.escapeRegExp() + '=([^;]*)');
// 默认decode,否则不decode
if (this.options.decode) {
return (value) ? decodeURIComponent(value[1]) : null;
}
else {
return (value) ? value[1] : null;
}
},
dispose: function() {
new Cookie(this.key, $merge(this.options, { duration: -1 })).write('');
return this;
}
});
Cookie.write = function(key, value, options){
return new Cookie(key, options).write(value);
};
// 加了个options参数,从而可以设置是否使用decode
// 和该类中其他参数使用的方法一致
Cookie.read = function(key, options) {
return new Cookie(key, options).read();
};
Cookie.dispose = function(key, options){
return new Cookie(key, options).dispose();
};
最后,这个Cookie类还有一个比较不爽的地方是,这里写Cookie的过期时间是以天为单位的,如果你只想保存几个小时,需要传入小于1的小数,嗯!
标签:mootools,Cookie,javascript,ajax
0
投稿
猜你喜欢
ACCESS中Field对象的标题属性
2008-11-20 17:44:00
WIN2003无法上传较大的文件Request对象错误解决方法
2007-08-10 09:44:00
IE7的web标准之道 Ⅲ
2008-08-20 12:55:00
ACCESS如何打印窗体中当前显示的记录
2008-11-20 16:31:00
js检测浏览器语种,适合于多语言版本的站点
2007-09-12 19:16:00
实例讲解如何配置MySQL数据库主从复制
2008-12-17 15:33:00
WEB前端开发高性能优化之JavaScript优化细节
2009-06-10 14:38:00
FSO读取BMP,JPG,PNG,GIF图像文件信息的函数
2007-08-04 09:56:00
eWebEditor不支持IE8的解决方法
2009-11-02 10:59:00
如何恢复/修复SQL Server的MDF文件
2008-11-24 15:30:00
详解phpMyAdmin的安装和配置
2007-06-15 09:56:00
思考关于搜索框的设计
2008-12-09 18:17:00
Access数据库中“所有记录中均未找到搜索关键字”的解决方法
2011-04-14 10:31:00
JQuery获取表单值
2009-11-19 13:17:00
Mysql数据库的完全备份
2011-08-05 18:46:25
互联网产品设计师职业生涯
2009-04-20 20:41:00
sql server中批量插入与更新两种解决方案分享(存储过程)
2012-05-22 18:29:59
让你的主页声色并茂—巧为网页添加背景音乐
2010-09-02 12:35:00
CSS实例讲解:地图提示
2007-05-11 17:04:00
IE bug: 1像素的dotted/dashed边框
2009-10-28 18:45:00