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
投稿

猜你喜欢

  • python多重继承实例

    2022-02-06 12:12:34
  • Python可视化神器pyecharts绘制雷达图

    2021-09-30 14:50:48
  • BootStrap tooltip提示框使用小结

    2023-07-02 05:25:25
  • pytorch的batch normalize使用详解

    2023-12-23 04:24:26
  • Python用input输入列表的实例代码

    2021-09-22 09:33:53
  • 详细介绍在pandas中创建category类型数据的几种方法

    2023-01-13 15:40:57
  • SQLserver 2000中出现“指定的服务并未以已安装的服务存在 解决方案

    2011-04-27 14:33:00
  • MySQL数据库高级数据操作之新增数据

    2024-01-18 17:46:38
  • Python Flask前后端Ajax交互的方法示例

    2021-09-07 09:09:21
  • Micropython固件使用Pico刷固件并配置VsCode开发环境的方法

    2022-09-21 16:22:14
  • 将python依赖包打包成window下可执行文件bat方式

    2022-01-25 08:11:43
  • python调用支付宝支付接口流程

    2022-01-15 14:04:45
  • 如何有效防止sql注入的方法

    2024-01-18 21:18:13
  • Python实现批量读取图片并存入mongodb数据库的方法示例

    2021-03-25 01:51:53
  • SQL重复记录处理(查找,过滤,删除)

    2008-11-17 20:47:00
  • Django利用LogEntry生成历史操作实战记录

    2021-10-23 04:23:58
  • MYSQL建立外键失败几种情况记录Can't create table不能创建表

    2024-01-22 19:57:22
  • python定义类self用法实例解析

    2022-01-08 14:11:01
  • 如何使用表格来储存数据库的记录?

    2010-05-16 15:14:00
  • Python如何快速生成本项目的requeirments.txt实现

    2023-07-21 17:02:04
  • asp之家 网络编程 m.aspxhome.com