javascript 操作cookies及正确使用cookies的属性


Posted in Javascript onOctober 15, 2009

一、从写 cookie 说起
var the_date = new Date("December 31, 2020");
var expiresDate = the_date.toGMTString();
document.cookie = "userDefineCSS=" + escape(title) + "; expires=" + expiresDate;

第一句是日期对象;

第二句将日期格式转换成 GMT 格式;编者者: GMT 即格林威治标准时间,现在也称 UTC 即全球标准时间。

第三句是将 cookie 内容写入客户端。

其中 expires 是系统使用的,表示 cookie 的失效日期(也可以省略),expires 不可读。

escape 是对 cookie 值进行编码,这是为了处理中文、空格等而设立的。

二、取 cookie 是比较简单的。
function GetCSS()
{
var cookieStr = document.cookie; //取 cookie 字符串,由于 expires 不可读,所以 expires 将不会出现在 cookieStr 中。
if (cookieStr == "")
{
return "main1"; //没有取到 cookie 字符串,返回默认值
}
var cookieValue = cookieStr.split("; "); //将各个 cookie 分隔开,并存为数组,多个 cookie 之间用分号加空隔隔开,不过前面我们只使用了一个 cookie,它的值与 expires 之间也是用分号加空格隔开的

var varName = "userDefineCSS"; 
var startPos = -1; 
var endPos = -1; 
for (var i=0; i<cookieValue.length; i++) 
{ 
startPos = cookieValue[i].indexOf(varName); 
if (startPos != 0) 
{ 
continue; //当前 cookie 不是名称为 varName 的 cookie,判断下一个 cookie 
} 
startPos += varName.length + 1; //当前 cookie 就是名称为 varName 的 cookie,由于有等号,所以 +1 
endPos = cookieValue[i].length; 
var css = unescape(cookieValue[i].substring(startPos, endPos)); 
return css; 
} 
return "main1"; 
}

 由于写 cookie 时使用了 escape,所以返回 cookie 值时使用 unescape 进行解码。

正确使用cookies的属性


首先看看cookies的结构

我们这里所说的 cookie 结构并非其存储结构,而是其表现结构,主要通过研究其表现结构来实现 JS(JavaScript) 对 cookie 的操作。

cookie 的表现结构较为简单,每个 cookie 由 cookie 名称 和 cookie 值组成,用等号表示二者关系,各个 cookie 之间用分号加空格隔开。正如前面所说 expires、path、domain 均不可读,所以在表现结构中也没有体现出来。
cookieName1=cookieValue1; cookieName2=cookieValue2[...; cookieNamen=cookieValuen]

通过分隔分号加空格符号,就可以获得各个 cookie,再通过分隔等号,就可以得出各个 cookie 的名称和值。

cookie 的子键,只是表现在 cookieValue 上,一个子键的结构是:子键名称=子键值,多个子键之间用 & 连接起来。比如:

cookieName1=子键名称1=子键值1&子键名称2=子键值2

如果是 ASP 文件,我们会发现 cookie 结构中有这样一段字符串:ASPSESSIONIDQSTDRATQ=24位字符

关于此,查看:http://www.aspxuexi.com/aspbasic/cookie/2006-6-10/Session_Cookie.htm

同名的 cookie,不同的 domain 或不同的 path,属不同的 cookie;

同名的 cookie,相同的 domain 且相同的 path,不同的 expires,属同一个 cookie。

cookie 有路径--path,表示哪些路径下的文件有权限读取该 cookie。

path 应该以 "/" 结尾,同名 cookie,不同 path,属不同的 cookie
document.cookie = "N1=1; path=/path/";
document.cookie = "N1=2; path=/path";
document.cookie = "N1=3; path=path/";

如上代码,前两句使用的是绝对路径,即相对于站点根目录的网页目录,第三句使用的是相对路径,相对于当前目录的。

第一句和第二句在于结尾不同,虽然他们所表达的权限相同,但是由于 path 字符串不同,会形成两个同名的 cookie,容易造成混乱,我们建议不要使用第二句这种格式,因为系统默认也是以 "/" 结尾的。

所以如上述是三个 cookie,之间不会相互覆盖。

path 属性值有大小写之分,应与浏览器中的地址栏的输入一致
document.cookie = "N1=1; path=/path/";
document.cookie = "N1=2; path=/paTH/";

这是两个不同的 cookie,因为 path 属性值大小写不同,如果我们在地址栏输入的是 path,那么就读取第一个 N1,如果我们输入的是 paTH,那么就读取第二个 N1

path 不可读

同 expires 一样,path 只可写,不可读。

path 不可更改

同 expires 不一样,如果我们试图更改 path,那么实际上我们是另外写了一个 cookie,而不是更改了 path 值。

path 权限有继承性

假如指定了 /test/ 目录有权限读取某 cookie,那么 /test/ 之下的目录 /test/t/ 也有权限读取该 cookie。

cookie 有失效日期--expires,如果还没有过失效期,即使重新启动电脑,cookie 仍然不会丢失,如果没有指定 expires 值,那么在关闭浏览器时,cookie 即失效。

在 JS(JavaScript) 中使用 expires 时应该和 cookie 同时写入,如:
document.cookie = "clr=red; expires=" + expiresDate;

而如下写法是不正确的:
document.cookie = "clr=red";
document.cookie = "expires=" + expiresDate;

这样写会形成两个 cookie,第二个 cookie 的名称是 expires,两个 cookie 均没有指定失效日期。

expires 不可读

这就是为什么,我们在 ASP 中使用 response.Write request.cookies("cname").expires 会出错,同样在 JS(JavaScript) 中使用 document.cookie 也不会显示出 expires。

expires 值应该使用 GMT 格式的时间
var the_date = new Date("December 31, 2020");
var expiresDate = the_date.toGMTString(); //转换成 GMT 格式。

Javascript 相关文章推荐
JavaScript多线程的实现方法
May 08 Javascript
JS.getTextContent(element,preformatted)使用介绍
Sep 21 Javascript
jQuery动画出现连续触发、滞后反复执行的解决方法
Jan 28 Javascript
更高效的使用JQuery 这里总结了8个小技巧
Apr 13 Javascript
微信小程序 获取设备信息 API实例详解
Oct 02 Javascript
如何提高javascript加载速度
Dec 26 Javascript
js轮播图透明度切换(带上下页和底部圆点切换)
Apr 27 Javascript
JSON在Javascript中的使用(eval和JSON.parse的区别)详细解析
Sep 05 Javascript
使用pm2部署node生产环境的方法步骤
Mar 09 Javascript
javascript for循环性能测试示例
Aug 07 Javascript
JS实现旋转木马轮播图
Jan 01 Javascript
Javascript柯里化实现原理及作用解析
Oct 22 Javascript
extjs 学习笔记(三) 最基本的grid
Oct 15 #Javascript
JavaScript Array扩展实现代码
Oct 14 #Javascript
JavaScript 动态创建VML的方法
Oct 14 #Javascript
JavaScript读取中文cookie时的乱码问题的解决方法
Oct 14 #Javascript
jQuery 标题的自动翻转实现代码
Oct 14 #Javascript
JavaScript 替换Html标签实现代码
Oct 14 #Javascript
JavaScript null和undefined区别分析
Oct 14 #Javascript
You might like
追忆往昔!浅谈收音机的百年发展历史
2021/03/01 无线电
PHP数组操作类实例
2015/07/11 PHP
PHP实现的折半查找算法示例
2017/12/19 PHP
Laravel解决nesting level错误和隐藏index.php的问题
2019/10/12 PHP
Vagrant(WSL)+PHPStorm+Xdebu 断点调试环境搭建
2019/12/13 PHP
jQuery EasyUI API 中文文档 可调整尺寸
2011/09/29 Javascript
使用jquery.upload.js实现异步上传示例代码
2014/07/29 Javascript
jquery实现点击展开列表同时隐藏其他列表
2015/08/10 Javascript
JavaScript学习笔记之数组求和方法
2016/03/23 Javascript
js仿腾讯QQ的web登陆界面
2016/08/19 Javascript
通过网页查看JS源码中汉字显示乱码的解决方法
2016/10/26 Javascript
JS库 Highlightjs 添加代码行号的实现代码
2017/09/13 Javascript
layer子层给父层页面元素赋值,以达到向父层页面传值的效果实例
2017/09/22 Javascript
React中使用async validator进行表单验证的实例代码
2018/08/17 Javascript
Javascript幻灯片播放功能实现过程解析
2020/05/07 Javascript
vue自定义插件封装,实现简易的elementUi的Message和MessageBox的示例
2020/11/20 Vue.js
python实现DNS正向查询、反向查询的例子
2014/04/25 Python
python中如何使用正则表达式的非贪婪模式示例
2017/10/09 Python
人脸识别经典算法一 特征脸方法(Eigenface)
2018/03/13 Python
Python读取properties配置文件操作示例
2018/03/29 Python
python 把列表转化为字符串的方法
2018/10/23 Python
使用PM2+nginx部署python项目的方法示例
2018/11/07 Python
Python3爬虫之urllib携带cookie爬取网页的方法
2018/12/28 Python
Python读取实时数据流示例
2019/12/02 Python
Python使用graphviz画流程图过程解析
2020/03/31 Python
python脚本和网页有何区别
2020/07/02 Python
CSS3 Notes: -webkit-box-reflect实现倒影的实例
2016/12/08 HTML / CSS
用HTML5实现鼠标滚轮事件放大缩小图片的功能
2015/06/25 HTML / CSS
欧洲有机婴儿食品最大的市场:Organic Baby Food(供美国和加拿大)
2018/03/28 全球购物
捷克原创男装和女装购物网站:Bolf.cz
2018/04/28 全球购物
红领巾心向党广播稿
2014/01/19 职场文书
幼儿园英语教学反思
2014/01/30 职场文书
2014年外联部工作总结
2014/11/17 职场文书
唱歌比赛拉拉队口号
2015/12/25 职场文书
java中重写父类方法加不加@Override详解
2021/06/21 Java/Android
Python实现聚类K-means算法详解
2022/07/15 Python