JS--中的 Cookie 与存储
Cookie 主要是在客户端进行一些简单的数据存储等,使用来提供本地化存储的脚本功能。Cookie 的处理环境本身是需要在服务器下进行的,但是现在的大部分浏览器都已经支持Cookie本地化的存储于处理。
一 Cookie 的组成
Cookie 是由名/值对组成:name=value; 完整的形式为:
name=value;[expires=过期时间];[path=路径限制];[domain=域名限制];[secure].其中前面的name=value是必选,后面中括号中的内容是可选,每一个选项之间用分号隔开。
name=value:就是存储在Cookie文件中的cookie名称和对应的值,name和value都是开发人员自己取的名字,后存储的会将先存储的进行覆盖掉,最好是用encodeURIComponent()方法对其进行编码。
expires=过期时间:这个是可可选项,是用来设置当前cookie的过期时间的,当过了这个时间后,浏览器会自动的清理此cookie,如果不设置默认的在浏览器关闭的时候将此cookie选项给清理掉。
domain=域名限制:设置了此项目,用于限制只有设置的域名才可以访问,那么没有设置,会默认限制为创建cookie 的域名,如果待访问的域名和设置的域名不一样是不能够访问的。如果设置域名访问,必须在当前域名绑定的服务器上面设置,如果在当前域名绑定的服务器上面任意设置其它域名是不能够设置成功的,这样创建也不能够成功。并且,如果设置为www.baidu.com那么在这个域名下的所有页面都可以访问当前cookie,而如果设置为baike.baidu.com
则只能是这个二级域名中的网页来访问这个cookie文件,主域名和其它同级的二级域名是不能够访问则个cookie的。
path=限制路径:访问路径, 当设置了路径, 那么只有设置的那个路径文件才可以访问 cookie
secure:安全设置,指明必须通过安全的通信通道来传输(HTTPS)才能获取 cookie。。通过普通的HTTP来使无法获取指明了由secure保存的cookie的,即使本地也不行
代码:
<span style="font-size:18px;">document.cookie = "user3="+encodeURIComponent('你是谁'); var date=new Date();
date.setDate(date.getDate()+3);
var path="/G:/"
document.cookie="ppp=abced;expires="+date+'path='+path; document.cookie="user=wanzheng;domain=yc60.com;path=/;expires='+date+';secure";</span>
二 封装方法
1、设置Cookie文件
从上面可以看出如果每一个cookie都这样写的话,有点麻烦,可以通过封装成一个方法来进行cookie的获取和设置。JS由于是弱类型的语言,对调用的函数的参数个数的匹配要求也并不严格,在下面的cookie设置函数中,如果有的参数没有传递过来,也是不会报错的。如果中间有的参数不传递,但要传递两边的参数,那么中间的参数用null代替即可
<span style="font-size:18px;">//cookie 名称,值,过期时间,限制路径,限制域名,限制安全连接
function setCookie(name,value,expires,path,domain,secure){
var strCookie = encodeURIComponent(name) + '=' + encodeURIComponent(value);<span style="white-space:pre"> </span>//对分号也会进行一个编码
if(expires instanceof Date){
strCookie += ';expires = ' + expires;
}
if(path){
strCookie += ';path=' + path;
}
if(domain){
strCookie += ';domain=' + domain;
}
if(secure){
strCookie += ';secure';
}
document.cookie = strCookie;
}</span>
2、获取Cookie文件
通过documen.cookie 就可获取当前页面设置的所有的cookie文件,但是,返回的是一个字符串,是cookie文件夹下所有的名值对用分号和空格组成的字符串,格式如下:
<span style="font-size:18px;">document.cookie='user=abcd';
document.cookie='email=ema;il@qq.com'; //分号如果不进行编码的话,后面的是存不进去的
document.cookie='email2=email@qq.com';
document.cookie='numb=1235';
alert(document.cookie); //user=abcd; email=ema; email2=email@qq.com; numb=1235</span>
但是通常情况下,我们都是希望通过Cookie名称来获得值,所有封装一个方法:
<span style="font-size:18px;">//根据传递过来的cookie名称,获得值
function getCookie(name){
var cookName = encodeURIComponent(name) + "=";
//先用正则表达式来精确匹配,是否存在,如果不存在就直接返回
var flage=document.cookie.match(new RegExp('(\\s|^)' + cookName));//每个名值对之前都有一个空格,但是开始的第一个没有
if(! flage){
return;
}
//获得传递过来的缓存名在缓存字符串中的索引,如果不存在就返回的是-1
var startIndex = document.cookie.indexOf(cookName);
var cookValue = null; if(startIndex > -1){
var endIndex = document.cookie.indexOf(';',startIndex); //从起始位置开始检索分号的位置
if(endIndex == -1){ //是最后一个cookie
endIndex = document.cookie.length;
}
cookValue = decodeURIComponent(document.cookie.substring(startIndex+cookName.length,endIndex));
}
return cookValue;
}</span>
3、对设置Cookie时的时间的处理
在设置cookie的时候,一般是通过传递一个天数,然后就可以设置它的过期时间等,故封装成一个方法:
<span style="font-size:18px;">//用户传递一个保存的天数,返回过期的日期
function getDate(day){
var date = null;
if(typeof day == 'number' && day > 0){
date = new Date();
date.setDate(date.getDate() + day);
}else{ //抛出一个异常,或者也可以设置为当前的天数
throw new Error('您传递的天数不合法,必须是大于0的整数') }
return date;
}</span>
4、调用方法设置和获取Cookie文件
<span style="font-size:18px;">setCookie('user','abcd',getDate(3));
setCookie('email','qim;st@qq.com',getDate(4)); //传递分号过去,会自动进行编码
alert(document.cookie); <span style="white-space:pre"> </span>//输出的时候是将所有的缓存用分号和空格隔开连接
alert(document.cookie);
alert(getCookie('user'));
alert(getCookie('email')); //通过用正则表达式进行精确的匹配后,这个问题就能够解决
alert(getCookie('ail')); //这个同样有返回值,和上面这个是一样的
alert(getCookie('ai')); </span>
三 Cookie 的一些局限性
第一:每个特定的域名下最多生成 20 个 cookie(根据不同的浏览器有所区别) 。
1.IE6 或更低版本最多 20 个 cookie
2.IE7 和之后的版本最多可以 50 个 cookie。 IE7 最初也只能 20 个, 之后因被升级不定后增加了。
3.Firefox 最多 50 个 cookie
4.Opera 最多 30 个 cookie
5.Safari 和 Chrome 没有做硬性限制。
为了更好的兼容性,所以按照最低的要求来,也就是最多不得超过 20 个 cookie。当超过指定的 cookie 时,浏览器会清理掉早期的 cookie。IE 和 Opera 会清理近期最少使用的 cookie,Firefox 会随机清理 cookie。
第二、cookie 的最大大约为 4096 字节(4k),为了更好的兼容性,一般不能超过 4095 字节即可。
第三:cookie 存储在客户端的文本文件,所以特别重要和敏感的数据是不建议保存在cookie 的。比如银行卡号,用户密码等。
四 一些其它的存储方法
1、IE提供的利用Css属性来存储
IE 提供了一种存储可以持久化用户数据,叫做 userData,从 IE5.0 就开始支持。每个数据最多 128K,每个域名下最多 1M。这个持久化数据存放在缓存中,如果缓存没有清理,那么会一直存在。这个数据文件也是保存在 cookie 目录中,只要清除 cookie 即可。如果指定过期日期,则到期后自动删除,如果没有指定就是永久保存。
但是此种方法在IE11中已经不再支持
<span style="font-size:18px;"><div style="behavior:url(#default#userData)" id="box"></div>
window.onload=function(){
var box = document.getElementById("box");
box.setAttribute("name",'abced');
box.expires = setCookieDate(7); //直接点属性设置
box.save('user'); box.load('user');
alert(box.getAttribute('name')); box.removeAttribute('name'); //删除缓存中的文件
box.save('user')
})</span>
2、Web存储
在比较高的浏览器中,JavaScript 提供了 sessionStorage 以及localStorage。 localStorage是HTML5中替代老版本的globalSession的。
//Web存储,这个其实不是写在cookie文件中的,是写在缓存中的
//sessionStorage.setItem('user','abcde'); //通过方法来设置和读取 alert(sessionStorage.getItem('user')); //读取文件
sessionStorage.removeItem('user'); //移除文件
alert(sessionStorage.getItem('user')); //null //通过属性的方式来设置和获取
sessionStorage.book = 'woshiyiebshu';
alert(sessionStorage.book);
localStorage.book='nishiehnm';
alert(localStorage.book);
localStorage.setItem("she",'hehehe');
alert(localStorage.getItem('she'));
alert(localStorage.getItem('book'));
localStroage.removeItem('book');
alert(localStorage.book);
这三个对象[sessionStorage,globalStroage,localStorage]都是永久保存的,保存在缓存里,只有手工删除或者清理浏览器缓存方可失效。 在容量上也有一些限制, 主要看浏览器的差异, Firefox3+、 IE8+、 Opera 为 5M,Chrome 和 Safari 为 2.5M。
JS--中的 Cookie 与存储的更多相关文章
- 【原创】js中利用cookie实现记住密码功能
在登录界面添加记住密码功能,我首先想到的是在java后台中调用cookie存放账号密码,大致如下: HttpServletRequest request HttpServletResponse res ...
- 在node.js中使用COOKIE
node.js中如何向客户端发送COOKIE呢?有如下两个方案: 一.使用response.writeHead,代码示例: //设置过期时间为一分钟 var today = new Date(); v ...
- js中的cookie使用
在网上找到的资料,收藏一下 function getCookies(name) { var arr = document.cookie.match(new RegExp("(^| )&quo ...
- 在jsp页面的js中使用Cookie的原理介绍以及相应方法的代码
1. 设置cookie 1.1 每个cookie都是一个名/值对,可以把下面这样一个字符串赋值给document.cookie: document.cookie="user_Id=828&q ...
- js中对cookie的操作及json数据与cookie结合的用法
cookie的使用 添加cookie 添加cookie:document.cookie = “key=value”; // 一次写入一个键值对 document.cookie = 'test1=hel ...
- JS中浏览器的数据存储机制
一.JS中的三种数据存储方式 cookie.sessionStorage.localStorage 二.cookie 1.cookie的定义: cookie是存储在浏览器上的一小段数据,用来记录某些当 ...
- js 中的cookie
根据智能社31cookie基础与应用总结, cookie的特性: 1.同一个网站,共用一套cookie,实际上是根据域名来区分的. 如t.sina.com.cn ,和weibo.com这两个都是新浪微 ...
- js中的cookie
cookie就是一个存放数据的东西,存储量很小4kb,存放在客户端上和应用设备上. 应用场景 用户注册,用户登录,购物车. Chrome浏览器在计算机中存放cookie的位置 C:\Users\Adm ...
- js中实现cookie的增删改查(document.cookie的使用详情)
一.设置cookie的值 1.每个cookie都是一个名称/值对,名称/值对用等号连接,并将该名称/值对赋值给document.cookie即可.如:document.cookie="id= ...
- js中的cookie使用和vue-cookie的使用
在HTTP协议的定义中,采用了一种机制来记录客户端和服务器端交互的信息,这种机制被称为cookie,cookie规范定义了服务器和客户端交互信息的格式.生存期.使用范围.安全性. 在JavaScrip ...
随机推荐
- ASP.NET中@Page指令中的AutoEventWireup
AutoEventWireup:指示控件的事件是否自动匹配 (Autowire).如果启用事件自动匹配,则为 true:否则为 false.默认值为 true.如果设为false,则事件不可用.有关更 ...
- Visual Studio 2010 更新NuGet Package Manager出错解决办法
在Visual Studio 2010的扩展管理器中发现NuGet Package Manger有最新版本更新提示,选择更新安装提示以下错误信息: 2013/4/25 1:11:48 - Micros ...
- [leetcode]_Maximum Depth of Binary Tree
第三道树的题目,我还是不会,我擦,怎么递归算法还是不能很好理解.看来还得好好研究下递归算法. 题目:求一棵树的最大深度. 思路:递归地求取左子树最大深度 和 右子树最大深度,返回较大值即为 整棵树的 ...
- 如何批量转换 WordPress 文章分类
可能建博之初,分类设置过于详细,后来想重新整理并删除一些分类项目,比如删除分类A,并将其中的所有文章划归到分类B中,手动修改文章的分类过于麻烦,有木有什么方法可以批量移动文章到另一个分类中呢? 网上闲 ...
- sublime配置问题
sublime本身功能有限,我们需要装上一些插件使其变得强大.sublime在各个操作系统下都可以运行,但在linux下运行需要注意中文输入的问题. 下面我主要介绍一下常用插件.配置的建议以及在lin ...
- phpMyAdmin安装
phpMyAdmin是MySql的一个Web操作界面. phpMyAdmin官网貌似被和谐了,经常无法访问.不过我们可以从GitHub下载phpMyAdmin. 然后解压,搭建与普通的PHP网站一样. ...
- 负载均衡 IO etc.
IO多路复用之epoll总结 ↑2013年8月21日11:49:44 EPOLL下的accept(不错的blog) 关于TCP封包.粘包.半包 linux内核TCP相关参数解释 ↑2013年8月14日 ...
- 有关IE的操作(收藏夹,清理缓存等)
1.添加网页到收藏夹的函数: procedure AddURL(Folder, Url, Title: string); var MyUrlFile: TextFile; begin if Folde ...
- cxgrid对经过筛选过的数据的选择(反选)
// 下面这个主要是对查询出来的数据, 经过筛选后得到的数据中进行反选操作 ,然后对选择的数据进行修改(全选或选择一部分也可以根据些代码修改) Screen.Cursor := crHourGlass ...
- 009-python基础-数据类型-列表和元组
一.列表 在python中叫"列表",其他语言中成为"数组" 元素中可以存储字符串.数字甚至变量. 元素索引顺序从0开始. 例如 name_list[0] 就是 ...