JavaScriptCookie与存储

学习要点:

1.cookie

2.cookie局限性

3.其他存储

随着Web越来越复杂,开发者急切的需要能够本地化存储的脚本功能。这个时候,第一个出现的方案:cookie诞生了。cookie的意图是:在本地的客户端的磁盘上以很小的文件形式保存数据。

一.Cookie

cookie也叫HTTP Cookie,最初是客户端与服务器端进行会话使用的。比如,会员登录,下次回访网站时无须登录了;或者是购物车,购买的商品没有及时付款,过两天发现购物车里还有之前的商品列表。

HTTP Cookie要求服务器对任意HTTP请求发送Set-Cookie,因此,Cookie的处理原则上需要在服务器环境下进行。当然,现在大部分浏览器在客户端也能实现Cookie的生成和获取。(目前Chrome不可以在客户端操作,其他浏览器均可)

cookie的组成

cookie由名/值对形式的文本组成:name=value。完整格式为:

name=value; [expires=date]; [path=path]; [domain=somewhere.com]; [secure]

中括号是可选,name=value是必选。

向磁盘写入cookie

使用方式:

document.cookie = 名称

document.cookie = 名称 = 值

完整形式:document.cookie = 'user=值;expires=失效时间;path=访问路径;domain=访问域名;secure=安全的https限制通讯';

如果名称或者值有中文需要编码和解码

document.cookie = 'user=' + encodeURIComponent('李炎恢');    //编码方式向磁盘写入cookie
alert(decodeURIComponent(document.cookie)); //解码方式读取写入的cookie

读取写入的cookie

使用方式:

document.cookie

如果写入有编码,读取就需要解码

document.cookie = 'user=' + encodeURIComponent('李炎恢');    //编码方式向磁盘写入cookie
alert(decodeURIComponent(document.cookie)); //解码方式读取写入的cookie

expires=cookie有效时间

每个浏览器都各自保存了cookie文件,设置有效时间,就是告诉浏览器这个cookie保存多久,

失效时间,如果没有声明,则为浏览器关闭后即失效。声明了失效时间,那么时间到期后方能失效。

设置失效时间

expires=失效时间(单位Mon Dec 26 2016 15:07:40 GMT+0800)

var date = new Date();                        //创建日期对象
//getDate获取系统当前日期
//setDate将日期转换成毫秒数
date.setDate(date.getDate() + 7);
//alert(date); 返回Mon Dec 26 2016 15:07:40 GMT+0800
//向磁盘写入一个cookie文件,名称为user,值为林贵秀编码,有效时间expires=有效日期
document.cookie = "user= " + encodeURIComponent('林贵秀') +";expires=" + date;

PS:可以通过Firefox浏览器查看和验证失效时间。如果要提前删除cookie也非常简单,只要重新创建cookie把时间设置当前时间之前即可:date.getDate() - 1或new Date(0)。

path=cookie访问路径

访问路径,当设置了路径,那么只有设置的那个路径文件才可以访问cookie。

var date = new Date();                        //创建日期对象
//getDate获取系统当前日期
//setDate将日期转换成毫秒数
date.setDate(date.getDate() + 7);
//alert(date); 返回Mon Dec 26 2016 15:07:40 GMT+0800
var path = '/js/'; //表示当前工程目录下的js文件夹下
//向磁盘写入一个cookie文件,名称为user,值为林贵秀编码,有效时间expires=有效日期
document.cookie = "user= " + encodeURIComponent('林贵秀') +";expires=" + date + ";path=" + path;

domain=cookie访问域名

访问域名,用于限制只有设置的域名才可以访问,那么没有设置,会默认限制为创建cookie的域名

var date = new Date();                        //创建日期对象
//getDate获取系统当前日期
//setDate将日期转换成毫秒数
date.setDate(date.getDate() + 7);
//alert(date); 返回Mon Dec 26 2016 15:07:40 GMT+0800
var path = '/js/'; //表示当前工程目录下的js文件夹下
var domain = 'localhost'; //设置访问域名
//向磁盘写入一个cookie文件,名称为user,值为林贵秀编码,有效时间expires=有效日期
document.cookie = "user= " + encodeURIComponent('林贵秀') +";expires=" + date + ";path=" + path + ";domain=" + domain;

PS:如果定义了60.com,那么在这个域名下的任何网页都可访问,如果定义了v.60.com,那么只能在这个二级域名访问该cookie,而主域名和其他子域名则不能访问。

PS:设置域名,必须在当前域名绑定的服务器上设置,如果在60.com服务器上随意设置其他域名,则会无法创建cookie。

secure安全的https限制通讯

安全设置,指明必须通过安全的通信通道来传输(HTTPS)才能获取cookie。仅限加密连接

var date = new Date();                        //创建日期对象
//getDate获取系统当前日期
//setDate将日期转换成毫秒数
date.setDate(date.getDate() + 7);
//alert(date); 返回Mon Dec 26 2016 15:07:40 GMT+0800
var path = '/js/'; //表示当前工程目录下的js文件夹下
var domain = 'localhost'; //设置访问域名
//向磁盘写入一个cookie文件,名称为user,值为林贵秀编码,有效时间expires=有效日期
document.cookie = "user= " + encodeURIComponent('林贵秀') +";expires=" + date + ";path=" + path + ";domain=" + domain + ";secure";

PS:https安全通信链接需要单独配置。

JavaScript设置、读取和删除并不是特别的直观方便,我们可以封装成函数来方便调用。

//创建cookie
setCookie('usr1', '林闺秀1', 1);
setCookie('usr2', '林闺秀2', 2);
setCookie('usr3', '林闺秀3', 3); //创建cookie,创建cookie函数
//setCookie函数接收cookie,名称,值,失效日期(天数),[访问路径,访问域名,安全通讯https限制]
function setCookie(name, value, expires, path, domain, secure) {
//将接收到的名称和值编码后,格式化成键值对
var cookieText = encodeURIComponent(name) + '=' + encodeURIComponent(value);
if (typeof expires == "number" && expires > 0) { //判断接收到的失效日期,是否是数值类型并且大于0
var date = new Date(); //创建日期对象
date.setDate(date.getDate() + expires); //获取系统当前时间,加上接收到的失效时间等于总失效日期
cookieText += '; expires=' + date; //将失效日期累加到cookieText
}
if (path) { //判断访问路径是否存在
cookieText += '; expires=' + path; //如果访问路径存在,将访问路径累加到cookieText
}
if (domain) { //判断访问域名是否存在
cookieText += '; domain=' + domain; //如果访问域名存在,将访问域名累加到cookieText
}
if (secure) { //判断https通讯限制是否存在
cookieText += '; secure'; //如果https通讯限制存在,将https通讯限制累加到cookieText
}
document.cookie = cookieText; //向磁盘写入cookie文件
} //获取cookie
alert(getCookie('usr1'));
alert(getCookie('usr2'));
alert(getCookie('usr3')); //获取cookie,获取cookie函数,获取cookie名称的值
function getCookie(name) { //接收要获取的cookie名称,
//将接收到的cookie名称进行编码后,格式化赋值给cookieName
var cookieName = encodeURIComponent(name) + '=';
//用编码和格式化后的cookie名称,在document.cookie里查找它的索引位置
var cookieStart = document.cookie.indexOf(cookieName);
//默认cookie值为空
var cookieValue = null; if (cookieStart > -1) { //判断如果查找cookie名称的索引大于负一
//从cookie名称开始搜索;的位置
var cookieEnd = document.cookie.indexOf(';', cookieStart);
if (cookieEnd == -1) { //判断如果从cookie名称开始搜索;的位置等于负一
cookieEnd = document.cookie.length; //cookieEnd重新赋值等于document.cookie的长度
}
//截取字符串,cookie名称位置加上cookie名称长度等于截取开始位置,从cookie名称开始搜索;引号的位置为结束位置
//将截取的字符串解码
cookieValue = decodeURIComponent(document.cookie.substring(cookieStart + cookieName.length, cookieEnd));
}
return cookieValue; //返回解码后的cookie名称值
} //删除cookie
unsetCookie('usr1'); //删除cookie,删除cookie函数
function unsetCookie(name) { //接收要删除cookie名称
//重新创建此cookie,cookie名称等于空,过期时间设置成过去,这样cookie就失效了
document.cookie = name + "= ; expires=" + new Date(0);
}

二.cookie局限性

cookie虽然在持久保存客户端用户数据提供了方便,分担了服务器存储的负担。但是还有很多局限性的。

第一:每个特定的域名下最多生成20个cookie(根据不同的浏览器有所区别)。

1.IE6或更低版本最多20个cookie

2.IE7和之后的版本最多可以50个cookie。IE7最初也只能20个,之后因被升级不定后增加了。

3.Firefox最多50个cookie

4.Opera最多30个cookie

5.Safari和Chrome没有做硬性限制。

 

PS:为了更好的兼容性,所以按照最低的要求来,也就是最多不得超过20个cookie。当超过指定的 cookie时,浏览器会清理掉早期的cookie。IE和Opera会清理近期最少使用的cookie,Firefox会随机清理cookie。

 

第二:cookie的最大大约为4096字节(4k),为了更好的兼容性,一般不能超过4095字节即可。

 

第三:cookie存储在客户端的文本文件,所以特别重要和敏感的数据是不建议保存在cookie的。比如银行卡号,用户密码等。

三.其他存储

userData储存IE提供的一种存储其实属于css,非IE不支持,【及不推荐使用】IE10以上也不支持,为了将移除

IE提供了一种存储可以持久化用户数据,叫做userData,从IE5.0就开始支持。每个数据最多128K,每个域名下最多1M。这个持久化数据存放在缓存中,如果缓存没有清理,那么会一直存在。

//首先要在html页面写上cssstyle="behavior:url(#default#userData)"
//<div style="behavior:url(#default#userData)" id="box"></div> addEvent(window, 'load', function () { //创建事件,等待页面加载完毕后激发函数
//通过id获取到标签元素,
var box = document.getElementById('box');
//给元素添加一个属性名称和值,如果属性名称和值有中文需要编码
box.setAttribute('name', encodeURIComponent('林贵秀'));
//保存文件,里面写名称,相当于cookie名称
box.save('bookinfo'); //box.removeAttribute('name'); //删除userDate
//box.save('bookinfo'); box.load('bookinfo'); //相当于加载cookie名称,里面接收名称
//解码打印出元素的属性值
alert(decodeURIComponent(box.getAttribute('name')));
}); //跨浏览器添加事件,添加事件兼容
function addEvent(obj, type, fn) { //添加事件函数,接收3个参数,1事件对象,2事件名称,3事件函数
//判断浏览器如果支持w3c
if (obj.addEventListener) {
//就用w3c的addEventListener方法添加对象,将事件名称和事件函数传入添加事件
obj.addEventListener(type, fn, false);
} else if (obj.attachEvent) { //判断如果浏览器是IE9以下,就用IE的方法attachEvent添加事件
//将事件名称和事件函数传入创建对象
obj.attachEvent('on' + type, fn);
}
}

Web存储

在比较高版本的浏览器,JavaScript提供了sessionStorage和globalStorage。在HTML5中提供了localStorage来取代globalStorage。而浏览器最低版本为:IE8+、Firefox3.5+、Chrome 4+和Opera10.5+。

PS:由于这三个对浏览器版本要求较高,我们就只简单的在Firefox了解一下,有兴趣的可以通过关键字搜索查询。

sessionStorage数据Web存储

//通过方法存储和获取
sessionStorage.setItem('name', '李炎恢'); //存储数据
alert(sessionStorage.getItem('name')); //获取存储数据 //通过属性存储和获取
sessionStorage.book = '李炎恢'; //存储数据
alert(sessionStorage.book); //获取存储数据 //删除存储
sessionStorage.removeItem('name');

由于localStorage代替了globalStorage,所以在Firefox、Opera和Chrome目前的最新版本已不支持。

localStorage数据Web存储

//通过方法存储和获取
localStorage.setItem('name', '李炎恢'); //储存数据
alert(localStorage.getItem('name')); //读取储存数据
  
//通过属性存储和获取
localStorage.book = '李炎恢'; //储存数据
alert(localStorage.book); //读取储存数据
  
//删除存储
localStorage.removeItem('name');

PS:这三个对象都是永久保存的,保存在缓存里,只有手工删除或者清理浏览器缓存方可失效。在容量上也有一些限制,主要看浏览器的差异,Firefox3+、IE8+、Opera为5M,,Chrome和Safari为2.5M。

第一百二十四节,JavaScriptCookie与存储的更多相关文章

  1. 第三百二十四节,web爬虫,scrapy模块介绍与使用

    第三百二十四节,web爬虫,scrapy模块介绍与使用 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了 ...

  2. 第一百二十六节,JavaScript,XPath操作xml节点

    第一百二十六节,JavaScript,XPath操作xml节点 学习要点: 1.IE中的XPath 2.W3C中的XPath 3.XPath跨浏览器兼容 XPath是一种节点查找手段,对比之前使用标准 ...

  3. 第二百二十四节,jQuery EasyUI,ComboGrid(数据表格下拉框)组件

    jQuery EasyUI,ComboGrid(数据表格下拉框)组件 学习要点: 1.加载方式 2.属性列表 3.方法列表 本节课重点了解 EasyUI 中 ComboGrid(数据表格下拉框)组件的 ...

  4. 第一百二十五节,JavaScript,XML

    JavaScript,XML 学习要点: 1.IE中的XML 2.DOM2中的XML 3.跨浏览器处理XML 随着互联网的发展,Web应用程序的丰富,开发人员越来越希望能够使用客户端来操作XML技术. ...

  5. 第一百七十四节,jQuery,Ajax进阶

    jQuery,Ajax进阶 学习要点: 1.加载请求 2.错误处理 3.请求全局事件 4.JSON 和 JSONP 5.jqXHR 对象 在 Ajax 课程中,我们了解了最基本的异步处理方式.本章,我 ...

  6. 第一百六十四节,jQuery,常规选择器

    jQuery,常规选择器 学习要点: 1.简单选择器 2.进阶选择器 3.高级选择器 jQuery 最核心的组成部分就是:选择器引擎.它继承了 CSS 的语法,可以对 DOM 元 素的标签名.属性名. ...

  7. 第一百二十九节,JavaScript,理解JavaScript库

    JavaScript,理解JavaScript库 学习要点: 1.项目介绍 2.理解JavaScript库 3.创建基础库 从本章,我们来用之前的基础知识来写一个项目,用以巩固之前所学.那么,每个项目 ...

  8. 第一百五十四节,封装库--JavaScript,表单验证--提交验证

    封装库--JavaScript,表单验证--提交验证 将表单的所有必填项,做一个判断函数,填写正确时返回布尔值 最后在提交时,判断每一项是否正确,全部正确才可以 提交 html <div id= ...

  9. 第一百八十四节,jQuery-UI,验证注册表单

    jQuery-UI,验证注册表单 html <form id="reg" action="123.html" title="会员注册" ...

随机推荐

  1. TOGAF架构能力框架之架构委员会和架构合规性

    TOGAF架构能力框架之架构委员会和架构合规性 3. 架构委员会 正如前面所说,一个用来对架构治理策略的实现进行监督的跨组织的架构委员会是架构治理策略成功的主要要素之一.架构委员会应该能够代表所有主要 ...

  2. 对中级 Linux 用户有用的 20 个命令

    也许你已经发现第一篇文章非常的有用,这篇文章是继对初级Linux用户非常有用的20个命令的一个延伸. 第一篇文章的目的是为新手准备的而这篇文章则是为了Linux的中高级用户.在这里你将学会如何进行自定 ...

  3. NuGet的本地服务器安装与Package的发布

    NuGet的本地服务器安装与Package的发布 主要的步骤是按照下面的例子来做的: NuGet学习笔记(1)——初识NuGet及快速安装使用 NuGet学习笔记(2)——使用图形化界面打包自己的类库 ...

  4. 【转】Install Oracle Jdbc driver in your Maven local repository

    Install Oracle Jdbc driver in your Maven local repository If you are using Oracle, you must first in ...

  5. Discuz开源论坛

      Discuz开源论坛本地部署自动生成数据库   这个版本可能比较有点老,但是万变不离其宗,再新的版本都是在已有的基础上更新的,所以掌握方法是最重要的! 先上几张安装成功后的图 (安装成功的论坛首页 ...

  6. spring得到实例和new一个实例,哪个快?

    spring配置的bean是默认单例,那么在程序中,得到一个实例一定比创建一个实例的速度快,也更加省资源.今天实际测试的时候发现,new 一个对象比spring得到一个对象快多了.后面自己又加了个单例 ...

  7. html5 PACS漫谈

    2012年html5标准制定之后,其中canvas标签给程序猿提供了图像绘制的接口. 在医疗领域从事PACS开发的我发现BS结构的PACS系统开发有了新可能,不再需要客户端安装flash.active ...

  8. OOAD(面向对象分析和设计)GRASP之创建者模式(Creator)又称生成器模式学习笔记

    说OOAD是一门玄学,一点都不为过.又或许是因为我之前一直没有很好的建立面向对象的思想,更有可能是因为练得不够多...总之,一直没能很好理解,哪怕把一本叫做<UML和模式应用>的书翻来覆去 ...

  9. 关于js关闭浏览器技术细谈

    前言:前端时间做项目遇到一个js的问题,需要使用js关闭浏览器,在原有js代码是有这样功能的, 代码如下 window.close(); 但是呢,chrome,firefox等中有时候会不起作用. 后 ...

  10. 结构-行为-样式-requireJs实现图片轮播插件

    最近工作需要,就自己写了一个图片轮播插件,不过想到要集成到框架中,于是又用RequireJs改了一遍. 主要文件: style.css jquery-1.11.1.min.js require.js ...