Fdream's Blog
专注于WEB前端开发
Powered by Google

MooTools的Cookie类太“自作聪明”了

12 多云 2008-11
Fdream 发表于 Ajax Web, 已被阅读 1266 次, 评论 4 条
关键词:mootools javascript ajax
[ 阅读字体大小: ]

没注意到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的小数,嗯!

Related articles 您可能对这些文章也感兴趣:
Related comments 与该文相关的评论:(我也想说几句)
引用这个评论  Fdream 于 12/12/2008 12:35:00 AM 发表评论: 

嗯,不偷懒了,太对不起大家了,新的已经出炉了~

嗯,不偷懒了,太对不起大家了,新的已经出炉了~
引用这个评论  落落 于 12/11/2008 7:27:55 PM 发表评论: 

[mrgreen]8要偷懒。。。。。兄弟们侯着呢

[mrgreen]8要偷懒。。。。。兄弟们侯着呢
引用这个评论  Fdream 于 12/10/2008 12:46:18 PM 发表评论: 

呃,好的,马上继续……最近太懒了……

呃,好的,马上继续……最近太懒了……
引用这个评论  chumpklutz(朽木) 于 12/9/2008 10:35:31 PM 发表评论: 

大哥 Mootools的教程啥时候整完呀

等着看呢,急了~呵呵

大哥 Mootools的教程啥时候整完呀 等着看呢,急了~呵呵
Add a comment 我来说两句: 
禁止表情
禁止UBB
禁止图片
识别链接
识别关键字
表  情
arrow
用户名:   密码:  (匿名可不写) 同时注册?
验证码:   看不清?换个图片  看不清楚?换个图片

 
Copyright © 2005-2008,Fdream All Rights Reserved
Processed in 0.1718772 second(s) , unknow queries
Powered by OWord V0.1, Even Not Alpha
(此博客程序为半成品,请勿索取,以免给您的心灵造成创伤^_^)
鄂ICP备05026031号