JavaScript如何友好的操作的cookie
1.前言
众所周知,在JS中处理cookie有些复杂,因为其操作cookie的接口相当不友好,即BOM的document.cookie
属性。这个属性的独特之处在于它会因为使用它的方式不同而表现出不同的行为。
- 当用来获取属性时,
document.cookie
返回当前页面可用的所有cookie的字符串,即一系列有分号分隔的键值对,并且所有键和值都是经过URL 编码的,所以必须使用decodeURIComponent()
来解码。 - 当用于设置值的时候,
document.cookie
属性可以设置为一个新的cookie 字符串。这个cookie 字符串会被解释并添加到现有的cookie 集合中。设置document.cookie
并不会覆盖cookie,除非设置的cookie 的名称已经存在。例如:document.cookie = "name=NanLiangReXue";
这段代码创建了一个叫name 的cookie,值为NanLiangReXue。
正是由于JavaScript 中操作cookie 不是非常友好,所以我们常常需要自己封装操作函数来简化操作cookie 的过程。
2.cookie的组成
在操作cookie之前,我们有必要先来看看cookie是由哪几部分构成的。
- 名称name:一个唯一确定cookie 的名称。cookie 名称是不区分大小写的,所以myCookie 和MyCookie被认为是同一个cookie。然而,实践中最好将cookie 名称看作是区分大小写的,因为某些服务器会这样处理cookie。cookie 的名称必须是经过URL 编码的。
- 值value:储存在cookie 中的字符串值。值必须被URL 编码。
- 域domain:cookie 对于哪个域是有效的。所有向该域发送的请求中都会包含这个cookie 信息。这个值可以包含子域(subdomain,如www.wrox.com),也可以不包含它(如.wrox.com,则对于wrox.com的所有子域都有效)。如果没有明确设定,那么这个域会被认作来自设置cookie 的那个域。
- 路径path:对于指定域中的那个路径,应该向服务器发送cookie。例如,你可以指定cookie 只有从http://www.wrox.com/books/ 中才能访问,那么http://www.wrox.com 的页面就不会发送cookie 信息,即使请求都是来自同一个域的。
- 失效时间expries:表示cookie 何时应该被删除的时间戳(也就是,何时应该停止向服务器发送这个cookie)。默认情况下,浏览器会话结束时即将所有cookie 删除;不过也可以自己设置删除时间。这个值是个GMT 格式的日期(Wdy, DD-Mon-YYYY HH:MM:SS GMT),用于指定应该删除cookie 的准确时间。因此,cookie 可在浏览器关闭后依然保存在用户的机器上。如果你设置的失效日期是个以前的时间,则cookie 会被立刻删除。
- 安全标志secure:指定后,cookie 只有在使用SSL 连接的时候才发送到服务器。例如,cookie 信息只能发送给 https://www.wrox.com,而http://www.wrox.com 的请求则不能发送 cookie。
以上每一个字段信息都作为 Set-Cookie 头的一部分,使用分号加空格分隔每一段,如下例所示。
Set-Cookie: name=value; expires=Mon, 22-Jan-07 07:10:24 GMT; domain=.wrox.com;path=/; secure
该示例信息表示:指定了一个叫做name 的cookie,它会在格林威治时间2007 年1 月22 日7:10:24 失效,同时所有wrox.com 的子域和域名下(由path 参数指定的)所有页面都有效的cookie。因为设置了secure 标志,这个cookie 只能通过SSL 连接才能传输。
需要注意的是:域、路径、失效时间和secure 标志都是服务器给浏览器的指示,以指定何时应该发送cookie。这些参数并不会作为发送到服务器的cookie 信息的一部分,只有名值对儿才会被发送.
了解了cookie的组成之后,我们就可以开始封装cookie的操作函数了。
3.获取cookie
getCookie()
方法根据cookie 的名字获取相应的值。它会在document.cookie
字符串中查找cookie 名加上等于号的位置。如果找到了,那么使用indexOf()
查找该位置之后的第一个分号(表示了该cookie 的结束位置)。如果没有找到分号,则表示该cookie 是字符串中的最后一个,则余下的字符串都是cookie 的值。该值使用decodeURIComponent()进行解码并最后返回。如果没有发现cookie,则返回null。
function getCookie(name){
//首先判断是否有cookie
if(document.cookie.length > 0){
//将需要获取的name进行编码
var cookieName = encodeURIComponent(name) + "=",
//在当前cookie中检索是否有要获取的name
cookieStart = document.cookie.indexOf(cookieName),
cookieValue = null;
//当前cookie中如果有要获取的name
if(cookieStart != -1){
cookieStart = cookieStart + cookieName.length;
//以name=为起始,向后寻找第一个分号;
var cookieEnd = document.cookie.indexOf(";",cookieStart);
//如果没有找到分号,则表明该name位于cookie的最后一个键值对,那么cookieEnd直接去整个cookie的长度
if (cookieEnd == -1) {
cookieEnd = document.cookie.length;
}
//如果找到分号,则进行字符串分割,即可获得cookie字符串中键为name的值cookieValue
cookieVlue = decodeURIComponent(document.cookie.substring(cookieStart,cookieEnd));
}
return cookieVlue;
}
}
4.设置cookie
setCookie()
方法在页面上设置一个cookie,接收如下几个参数:
- cookie 的名称
- cookie 的值
- 可选的cookie的有效时间(单位:毫秒)
- 可选的URL 路径
- 可选的域
- 可选的表示是否要添加secure 标志的布尔值
参数是按照它们的使用频率排列的,只有头两个是必需的。在这个方法中,名称和值都使用encodeURIComponent()
进行了URL编码,并检查其他选项。方法的其他部分就是构造cookie 字符串并将其设置到document.cookie
中。
function setCookie(name, value, expires, path, domain, secure){
/*
*name:必须,要设置的cookie名称
*value:必须,要设置的cookie的值
*expires:可选,要设置的cookie的有效时间,单位为毫秒
*path:可选,对于指定域中的那个路径,应该向服务器发送cookie
*domain:可选,要设置的cookie对于哪个域是有效的
*secure:可选,布尔值,要设置的cookie是否只有在使用SSL连接的时候才发送到服务器
*/
var cookieText = encodeURIComponent(name) + "=" + encodeURIComponent(value);
if (expires) {
//将当前时间加上设置的有效时间得到该cookie最终的失效时间
var d = new Date();
d.setDate(d.getDate() + expires)
cookieText += "; expires=" + d.toGMTString();
}
if (path) {
cookieText += "; path=" + path;
}
if (domain) {
cookieText += "; domain=" + domain;
}
if (secure) {
cookieText += "; secure";
}
document.cookie = cookieText;
}
5.删除cookie
我们知道,不在有效期内的cookie将会被浏览器自动清除,因此,想要删除cookie我们只需将该cookie的失效时间设置为过去的时间即可。设置cookie的失效时间我们可以调用上面封装好的设置cookie函数,只需将expries
参数设置为-10000即可
function delCookie(name, path, domain, secure){
setCookie(name, "", -10000, path, domain, secure )
}
6.总结
我们可以将上面封装好的三个操作cookie的方法整合起来写入单独的JS文件cookieUtil.js
,方便日后使用。
var cookieUtil = {
getCookie:function (name){
//首先判断是否有cookie
if(document.cookie.length > 0){
//将需要获取的name进行编码
var cookieName = encodeURIComponent(name) + "=",
//在当前cookie中检索是否有要获取的name
cookieStart = document.cookie.indexOf(cookieName),
cookieValue = null;
//当前cookie中如果有要获取的name
if(cookieStart != -1){
cookieStart = cookieStart + cookieName.length;
//以name=为起始,向后寻找第一个分号;
var cookieEnd = document.cookie.indexOf(";",cookieStart);
//如果没有找到分号,则表明该name位于cookie的最后一个键值对,那么cookieEnd直接去整个cookie的长度
if (cookieEnd == -1) {
cookieEnd = document.cookie.length;
}
//如果找到分号,则进行字符串分割,即可获得cookie字符串中键为name的值cookieValue
cookieVlue = decodeURIComponent(document.cookie.substring(cookieStart,cookieEnd));
}
return cookieVlue;
}
},
setCookie:function (name){
//首先判断是否有cookie
if(document.cookie.length > 0){
//将需要获取的name进行编码
var cookieName = encodeURIComponent(name) + "=",
//在当前cookie中检索是否有要获取的name
cookieStart = document.cookie.indexOf(cookieName),
cookieValue = null;
//当前cookie中如果有要获取的name
if(cookieStart != -1){
cookieStart = cookieStart + cookieName.length;
//以name=为起始,向后寻找第一个分号;
var cookieEnd = document.cookie.indexOf(";",cookieStart);
//如果没有找到分号,则表明该name位于cookie的最后一个键值对,那么cookieEnd直接去整个cookie的长度
if (cookieEnd == -1) {
cookieEnd = document.cookie.length;
}
//如果找到分号,则进行字符串分割,即可获得cookie字符串中键为name的值cookieValue
cookieVlue = decodeURIComponent(document.cookie.substring(cookieStart,cookieEnd));
}
return cookieVlue;
}
},
delCookie:function (name, path, domain, secure){
this.setCookie(name, "", -10000, path, domain, secure )
}
}
export default cookieUtil;
(完)
JavaScript如何友好的操作的cookie的更多相关文章
- ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml) 用javascript在客户端删除某一个cookie键值对 input点击链接另一个页面,各种操作。 C# 往线程里传参数的方法总结 TCP/IP 协议 用C#+Selenium+ChromeDriver 生成我的咕咚跑步路线地图 (转)值得学习百度开源70+项目
ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml) 我们都知道在使用WebApi的时候Controller会自动将Action的返回值自动进行各种序列化处理(序列化为 ...
- js 判断js函数、变量是否存在 JS保存和删除cookie操作,判断cookie是否存在的方法
//是否存在指定函数 function isExitsFunction(funcName) { try { if (typeof(eval(funcName)) == " ...
- Day3JavaScript(一)JavaScript初识以及bom操作
JavaScript简介 什么是JavaScript 弱类型,动态类型,基于原型的直译性的编程语言.1995年netscape(网景)在导航者浏览器中设计完成. JavaScript的特点 1.与HT ...
- javascript 进阶篇1 正则表达式,cookie管理,userData
首先,什么事正则表达式呢,其实引入概念很多时候并不能帮我们明白它到底是什么,所以我先简单描述下,正则表达式,其实就是一个记录字符串规则则的字符串,等我们看完这一部分,也就能明白它到底是什么了. 基本语 ...
- Javascript学习笔记二——操作DOM
Javascript学习笔记 DOM操作: 一.GetElementById() ID在HTML是唯一的,getElementById()可以定位唯一的一个DOM节点 二.querySelector( ...
- 关于JavaScript中的delete操作
关于JavaScript中的delete操作 看到一道题,是这样的: (function(x){ delete x; return x; })(1); 1 null undefined Error 我 ...
- JavaScript对SVG进行操作的相关技术
原文地址:http://www.ibm.com/developerworks/cn/xml/x-svgscript/ 本文主要介绍在 SVG 中通过编程实现动态操作 SVG 图像的知识. SVG ...
- javascript中字符串常用操作整理
javascript中字符串常用操作整理 字符串的操作在js中非常频繁,也非常重要.以往看完书之后都能记得非常清楚,但稍微隔一段时间不用,便会忘得差不多,记性不好是硬伤啊...今天就对字符串的一些常用 ...
- JavaScript高级编程———数据存储(cookie、WebStorage)
JavaScript高级编程———数据存储(cookie.WebStorage) <script> /*Cookie 读写删 CookieUtil.get()方法根据cookie的名称获取 ...
随机推荐
- 最简单的JS实现json转csv
工作久了,总会遇到各种各样的数据处理工作,比如同步数据,初始化一些数据,目前比较流行的交互数据格式就是JSON,可是服务器中得到的JSON数据如果提供给业务人员看的话可能会非常不方便,这时候,转成CS ...
- 【TencentOS tiny】深度源码分析(6)——互斥锁
互斥锁 互斥锁又称互斥互斥锁,是一种特殊的信号量,它和信号量不同的是,它具有互斥锁所有权.递归访问以及优先级继承等特性,在操作系统中常用于对临界资源的独占式处理.在任意时刻互斥锁的状态只有两种,开锁或 ...
- 致所有.Net者和有梦想的朋友们 - 共勉
这篇文章很早就想写的了,主要是人到了一定的年纪,就想唠叨一些看法,认不认可不重要,重要的是生活给予你的酸甜苦辣,你都想一吐为快. 这里主要基于多年来自己的一个行业感受和以及生活感想,唠叨一下工作以及生 ...
- bugku color
下载打开压缩包是七张图片,分别是七个颜色,使用stegsolve打开发现了异常. 七张图片拼起来是 make me tall,看来是要修改图片高度. 我们使用winhex打开图片并在十六进制中修改图片 ...
- Python:numpy中shape和reshape的用法
>>> w=np.zeros((5,6))>>> warray([[ 0., 0., 0., 0., 0., 0.], [ 0., 0., ...
- Jenkins构建Jmeter项目之源代码管理(SVN)
1.查看项目创建中是否又svn插件,没有的话下载插件subversion 2.配置svn源代码管理,如下图(testcases目录下包含build.xml和脚本文件) 3.查看Jenkins本地工作空 ...
- 帝国CMS 6.5功能解密:网站安全防火墙使用说明
有关帝国CMS新版防火墙介绍可以查看:http://bbs.phome.net/showthread-13-136169-0.html 本文为大家讲解如何使用网站防火墙:一.配置“网站防火墙”有下面两 ...
- Python_散点图与折线图绘制
在数据分析的过程中,经常需要将数据可视化,目前常使用的:散点图 折线图 需要import的外部包 一个是绘图 一个是字体导入 import matplotlib.pyplot as plt fro ...
- 【前端词典】几个有益的 CSS 小知识
今天偷个懒,不长篇大论,分享几个你可能不知道的 CSS 小知识. 样式的顺序 CSS 代码: HTML 代码: 记得之前这是一道比较火的 CSS 考题,当时好像是有不少的人答错(30% 以上) ...
- docker2-容器的使用
[root@ipha-dev71- chenjl]# docker [root@ipha-dev71- chenjl]# docker pull training/webapp [root@ipha- ...