第 29 章 Cookie 与存储

学习要点:

1.cookie

2.cookie 局限性

3.其他存储

随着 Web 越来越复杂,开发者急切的需要能够本地化存储的脚本功能。这个时候,第

一个出现的方案:cookie 诞生了。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 是必选。

document.cookie = ‘user=‘ + encodeURIComponent(‘李炎恢‘); //编码写入

alert(decodeURIComponent(document.cookie));

//解码读取

expires=date 失效时间,如果没有声明,则为浏览器关闭后即失效。声明了失效时间,

那么时间到期后方能失效。

var date = new Date();

//创建一个

date.setDate(date.getDate() + 7);

document.cookie = "user= " + encodeURIComponent(‘李炎恢‘) +";expires=" + date;

PS:可以通过 Firefox 浏览器查看和验证失效时间。如果要提前删除 cookie 也非常简单,

只要重新创建 cookie 把时间设置当前时间之前即可:date.getDate() - 1 或 new Date(0)。

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

var path = ‘/E:/%E5%A4%87%E8%AF%BE%E7%AC%94%E8%AE%B0/JS1/29/demo‘;

document.cookie = "user= " + encodeURIComponent(‘李炎恢‘) + ";path=" + path;PS:为了操作方便,我直接把路径复制下来,并且增加了一个目录以强调效果。

domain=domain 访问域名,用于限制只有设置的域名才可以访问,那么没有设置,会

默认限制为创建 cookie 的域名。

var domain = ‘yc60.com‘;

document.cookie = "user= " + encodeURIComponent(‘李炎恢‘) + ";domain=" + domain;

PS:如果定义了 yc60.com,那么在这个域名下的任何网页都可访问,如果定义了

v.yc60.com,那么只能在这个二级域名访问该 cookie,而主域名和其他子域名则不能访问。

PS:设置域名,必须在当前域名绑定的服务器上设置,如果在 yc60.com 服务器上随意

设置其他域名,则会无法创建 cookie。

secure 安全设置,指明必须通过安全的通信通道来传输(HTTPS)才能获取 cookie。

document.cookie = "user= " + encodeURIComponent(‘李炎恢‘) + ";secure";

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

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

//创建 cookie

function setCookie(name, value, expires, path, domain, secure) {

var cookieText = encodeURIComponent(name) + ‘=‘ + encodeURIComponent(value);

if (expires instanceof Date) {

cookieText += ‘; expires=‘ + expires;

}

if (path) {

cookieText += ‘; expires=‘ + expires;

}

if (domain) {

cookieText += ‘; domain=‘ + domain;

}

if (secure) {

cookieText += ‘; secure‘;

}

document.cookie = cookieText;

}

//获取 cookie

function getCookie(name) {

var cookieName = encodeURIComponent(name) + ‘=‘;

var cookieStart = document.cookie.indexOf(cookieName);

var cookieValue = null;

if (cookieStart > -1) {var cookieEnd = document.cookie.indexOf(‘;‘, cookieStart);

if (cookieEnd == -1) {

cookieEnd = document.cookie.length;

}

cookieValue = decodeURIComponent(

document.cookie.substring(cookieStart + cookieName.length, cookieEnd));

}

return cookieValue;

}

//删除 cookie

function unsetCookie(name) {

document.cookie = name + "= ; expires=" + new Date(0);

}

//失效天数,直接传一个天数即可

function setCookieDate(day) {

if (typeof day == ‘number‘ && day > 0) {

var date = new Date();

date.setDate(date.getDate() + day);

} else {

throw new Error(‘传递的 day 必须是一个天数,必须比 0 大‘);

}

return date;

}

cookie 局限性

二.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 的。比如银行卡号,用户密码等。

三.其他存储

IE 提供了一种存储可以持久化用户数据,叫做 userData,从 IE5.0 就开始支持。每个数

据最多 128K,每个域名下最多 1M。这个持久化数据存放在缓存中,如果缓存没有清理,

那么会一直存在。

<div style="behavior:url(#default#userData)" id="box"></div>

addEvent(window, ‘load‘, function () {

var box = document.getElementById(‘box‘);

box.setAttribute(‘name‘, encodeURIComponent(‘李炎恢‘));

box.expires = setCookieDate(7);

box.save(‘bookinfo‘);

//box.removeAttribute(‘name‘);

//box.save(‘bookinfo‘);

//删除 userDate

box.load(‘bookinfo‘);

alert(decodeURIComponent(box.getAttribute(‘name‘)));

});

PS:这个数据文件也是保存在 cookie 目录中,只要清除 cookie 即可。如果指定过期日

期,则到期后自动删除,如果没有指定就是永久保存。

Web 存储

在比较高版本的浏览器,JavaScript 提供了 sessionStorage 和 globalStorage。在 HTML5

中提供了 localStorage 来取代 globalStorage。而浏览器最低版本为: IE8+、 Firefox3.5+、 Chrome

4+和 Opera10.5+。

PS:由于这三个对浏览器版本要求较高,我们就只简单的在 Firefox 了解一下,有兴趣

的可以通过关键字搜索查询。

//通过方法存储和获取

sessionStorage.setItem(‘name‘, ‘李炎恢‘);

alert(sessionStorage.getItem(‘name‘));

//通过属性存储和获取

sessionStorage.book = ‘李炎恢‘;

alert(sessionStorage.book);

//删除存储

sessionStorage.removeItem(‘name‘);PS:由于 localStorage 代替了 globalStorage,所以在 Firefox、Opera 和 Chrome 目前的最

新版本已不支持。

//通过方法存储和获取

localStorage.setItem(‘name‘, ‘李炎恢‘);

alert(localStorage.getItem(‘name‘));

//通过属性存储和获取

localStorage.book = ‘李炎恢‘;

alert(localStorage.book);

//删除存储

localStorage.removeItem(‘name‘);

PS:这三个对象都是永久保存的,保存在缓存里,只有手工删除或者清理浏览器缓存

方可失效。在容量上也有一些限制,主要看浏览器的差异,Firefox3+、IE8+、Opera 为 5M,,

Chrome 和 Safari 为 2.5M。

时间: 2024-07-28 15:46:08

第 29 章 Cookie 与存储的相关文章

cookie 是存储于访问者的计算机中的变量

今天把javascript如何用来创建及存储cookie复习了一下,其中的一点体会拿出来和大家讨论,首先看一下基础知识: 什么是cookie cookie 是存储于访问者的计算机中的变量.每当同一台计算机通过浏览器请求某个页面时,就会发送这个 cookie.你可以使用 JavaScript 来创建和取回 cookie 的值. 有关cookie的例子 名字 cookie: 当访问者首次访问页面时,他或她也许会填写他/她们的名字.名字会存储于 cookie 中.当访问者再次访问网站时,他们会收到类似

字符编码--第2章 数的存储

第2章 数的存储 第1节 机器数 计算机中,表示数和数的符号的二进制数,叫做机器数.机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1. 比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011.如果是 -3 ,就是 10000011 .那么,这里的 00000011 和 10000011 就是机器数. 机器数可用不同的码制来表示,常用的有原码.补码和反码表示法. 第2节 真值 因为第一位是符号位,所以机器数的形式值就不等于真正的数值.例如上面的有符

JS基础——Cookie与存储

一.Cookie是什么 Cookie是一种客户端(浏览器)把用户信息以文件形式存储到本地硬盘的技术,说白了就是一种浏览器技术 二.Cookie的作用 Cookie的作用很单一,就是存储客户数据.(存储数据的文件叫Cookie文件) 三.Cookie与变量的区别 变量:数据是存储到内存中的,是一种暂时存储(一关浏览器就没了) Cookie:数据是存储到Cookie文件中的(硬盘),是一种长期存储(即使关了浏览器还存在) 四.Cookie的注意事项 1.不同浏览器存放Cookie的位置不同,也是不能

第29章 CSS伸缩弹性布局(上)

第 29章 CSS3弹性伸缩布局[上]学习要点:1.布局简介2.旧版本 本章主要探讨 HTML5中 CSS3提供的用来实现未来响应式弹性伸缩布局方案,这里做一个初步的了解.一.布局简介CSS3提供一种崭新的布局方式:Flexbox布局,即弹性伸缩布局模型(Flexible Box).用来提供一个更加有效的方式实现响应式布局.但是用于这个布局方式还处于 W3C的草案阶段,并且它还分为旧版本.新版本以及混合过渡版本三种不同的编码方式.在发展中,可能还有各种改动,浏览器的兼容性还存在问题.所以,本节课

MVC5+EF6 简易版CMS(非接口) 第三章:数据存储和业务处理

目录 简易版CMS后台管理系统开发流程 MVC5+EF6 简易版CMS(非接口) 第一章:新建项目 MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型 MVC5+EF6 简易版CMS(非接口) 第三章:数据存储和业务处理 MVC5+EF6 简易版CMS(非接口) 第四章:使用业务层方法,以及关联表解决方案 先来了解下各项的引用关系 FytCms.DALMSSQL=>Domain.Entity.EntityFramework BusinessLogic.Server=>FytCms.D

第29章 层次查询

第29章 层次查询 查询员工上下级关系 查看员工上级领导select empno,ename,mgr from emp start with empno=7839 connect by prior mgr=empno; 查看领导的下属select empno,ename,mgr from emp start with empno=7839 connect by prior empno=mgr; 分级查看,加入位列levelselect empno,ename,mgr,level from emp

cookie本地存储

本地存储 所谓的本地存储,其实就是把一些信息,存储到客户端版本地,存储的信息不会因为页面的跳转或关闭而消失,这样就可以实现很多功能需求了. 特点 虽然是存储到本地了,但是有浏览器中间的访问限制,例如:谷歌下存储的信息在IE中访问不到 还会存在域名和域名之间的访问限制,例如:在谷歌下访问京东,存储了京东的客户信息,当我们用谷歌浏览器打开了百度,百度是无法获取原来在京东下存储的本地信息的 本地存储应用的案例: 登录的时候,记住用户名和密码,其实就是把信息存储到客户端本地,下一次再打开页面的时候,直接

[原创]java WEB学习笔记29:Cookie Demo 之自动登录

1. 自动登录 的需求 ① 不需要填写用户名和密码等信息,可以自动登录到系统 ②  login.jsp  hello.jsp login.jsp 1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01

算法导论2-9章补充几道题

本篇博文意在对前几章中遗漏的,本人觉得有意思的习题当独拿出来练练手. 1.习题2-4,求逆序对,时间复杂度要求Θ(nlgn) 定义:对于一个有n个不同的数组A, 当i<j时,存在A[i]>A[j],则称对偶(i, j)为A的一个逆序对. 譬如:<2,3,8,6,1>有5个逆序对. 解题思路:归并排序的思想:逆序对的数量=左区间的逆序对+右区间的逆序对+合并的逆序对 代码如下: 1 #include <iostream> 2 #include <vector>