MooTools的Cookie类太“自作聪明”了
作者:Fdream 来源:Fdream博客 发布时间:2008-11-13 12:59:00
标签:mootools,Cookie,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的小数,嗯!


猜你喜欢
- 第一种方法: 代码如下:/* 创建链接服务器 */ exec sp_addlinkedserver 'srv_lnk
- 1.main.js文件中添加已下代码Vue.directive('drag', { //1.指令绑定到元素上回立
- #!/usr/bin/env python# -*- coding:utf-8 -*-# *************************
- 例如torch.nn.ReLU(inplace=True)inplace=True表示进行原地操作,对上一层传递下来的tensor直接进行修
- 一、基础内容import tkinter as tkfrom PIL import Image,ImageTkdef my():  
- 以下是通过Excel 的VBA连接Oracle并操作Oracle相关数据的示例Excel 通过VBA连接数据库需要安装相应的Oracle客户
- 一、基本用法Queue类实现了一个基本的先进先出容器。使用put()将元素增加到这个序列的一端,使用get()从另一端删除。具体代码如下所示
- 全局变量与局部变量# num1是全局变量num1 = 1# num2是局部变量def func():num2 = 2在函数外(且不在函数里)
- 背景最近做项目开发出现一个需求,就是前端会发来用户对某一项内容的报错,报错信息中包含出错内容的id,为了方便管理,需要实现点击这个id直接转
- 第一招、mysql服务的启动和停止net stop mysqlnet start mysql第二招、登陆mysql语法如下: mysql -
- 前言yield的英文单词意思是生产,刚接触Python的时候感到非常困惑,一直没弄明白yield的用法。最近又重新学习了下,所以整理了下面这
- 一、避免Firefox 背景图不显示的兼容问题,定义background 属性,先后顺序不能随意变动。background : backgr
- 一、要求二、原理决策树是一种类似于流程图的结构,其中每个内部节点代表一个属性上的“测试”,每个分支代表测试的结果,每个叶节点代表一个测试结果
- 最近做的都是前端的项目,很多项目都有回到顶部的需求,下面把我写js代码做个笔录,方便以后查找。发现还可以添加从快到慢的动画效果和随时下拉滚动
- 什么是接口测试接口测试主要用于检测外部系统与内部系统之间,以及系统内部各 个子系统之间的交互点。其测试的重点是,检查数据的交换、传递和控 制
- 什么是双端队列双端队列是与队列类似的有序集合。它有一前、一后两端,元素在其中保持自己的位置。与队列不同的是,双端队列对在哪一端添加和移除元素
- 映射类型操作符(1)标准类型操作符 字典可以和所有的标准
- numpy.ndarray添加元素平常使用的比较多的是list,在list后面添加元素直接是data_list = []data_list.
- 先给大家讲解一下什么是kalikali是一种Linux系统,kali是专门用来渗透的,他是由back track系统演化而来的,后面结合了l
- 本文实例为大家分享了js实现黑白div块画空心图形的具体代码,供大家参考,具体内容如下<!DOCTYPE html><ht