1. 各种存储方案的简单对比
2. Cookie
作为一个前端和Cookie打交道的次数肯定不会少了,Cookie算是比较古老的技术了 1993 年,网景公司雇员 Lou Montulli 为了让用户在访问某网站时,进一步提高访问速度,同时也为了进一步实现个人化网络,发明了今天广泛使用的 Cookie。
2.1 Cookie的特点
我们先来看下Cookie的特点:
-
1)cookie的大小受限制,cookie大小被限制在4KB,不能接受像大文件或邮件那样的大数据。
-
2)只要有请求涉及cookie,cookie就要在服务器和浏览器之间来回传送(这解释为什么本地文件不能测试cookie)。而且cookie数据始终在同源的http请求中携带(即使不需要),这也是Cookie不能太大的重要原因。正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。
-
3)用户每请求一次服务器数据,cookie则会随着这些请求发送到服务器,服务器脚本语言如PHP等能够处理cookie发送的数据,可以说是非常方便的。当然前端也是可以生成Cookie的,用js对cookie的操作相当的繁琐,浏览器只提供document.cookie这样一个对象,对cookie的赋值,获取都比较麻烦。而在PHP中,我们可以通过setcookie来设置cookie,通过$_COOKIE这个超全局数组来获取cookie。
cookie的内容主要包括:名字,值,过期时间,路径和域。路径与域一起构成cookie的作用范围。若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存里的cookie,不同的浏览器有不同的处理方式。
2.2 Session
说到Cookie就不能不说Session。
Session机制。session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识(称为session id),如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(检索不到,会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session
id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。一般这个cookie的名字都是类似于SEEESIONID。但cookie可以被人为的禁止,则必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面。比如:http://damonare.cn?sessionid=123456
还有一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session
id传递回服务器。比如:
<form name="testform" action="/xxx"> <input type="hidden" name="sessionid" value="123456"> <input type="text"> </form>
实际上这种技术可以简单的用对action应用URL重写来代替。
2.3 Cookie和Session简单对比
Cookie和Session 的区别:
2.4 document.cookie的属性
expires属性
指定了coolie的生存期,默认情况下coolie是暂时存在的,他们存储的值只在浏览器会话期间存在,当用户推出浏览器后这些值也会丢失,如果想让cookie存在一段时间,就要为expires属性设置为未来的一个过期日期。现在已经被max-age属性所取代,max-age用秒来设置cookie的生存期。
path属性
它指定与cookie关联在一起的网页。在默认的情况下cookie会与创建它的网页,该网页处于同一目录下的网页以及与这个网页所在目录下的子目录下的网页关联。
domain属性
domain属性可以使多个web服务器共享cookie。domain属性的默认值是创建cookie的网页所在服务器的主机名。不能将一个cookie的域设置成服务器所在的域之外的域。例如让位于order.damonare.cn的服务器能够读取catalog.damonare.cn设置的cookie值。如果catalog.damonare.cn的页面创建的cookie把自己的path属性设置为“/”,把domain属性设置成“.damonare.cn”,那么所有位于catalog.damonare.cn的网页和所有位于orlders.damonare.cn的网页,以及位于damonare.cn域的其他服务器上的网页都可以访问这个cookie。
secure属性
它是一个布尔值,指定在网络上如何传输cookie,默认是不安全的,通过一个普通的http连接传输
2.5 cookie实战
这里我们使用javascript来写一段cookie,借用w3cschool的demo:
function getCookie(c_name){ if (document.cookie.length>0){ c_start=document.cookie.indexOf(c_name + "=") if (c_start!=-1){ c_start=c_start + c_name.length+1 c_end=document.cookie.indexOf(";",c_start) if (c_end==-1) c_end=document.cookie.length return unescape(document.cookie.substring(c_start,c_end)) } } return ""; } function setCookie(c_name,value,expiredays){ var exdate=new Date exdate.setDate(exdate.getDate+expiredays) document.cookie=c_name+ "=" +escape(value)+ ((expiredays==null) ? "" : "; expires="+exdate.toUTCString) } function checkCookie{ username=getCookie('username') if(username!=null && username!=""){alert('Welcome again '+username+'!')} else{ username=prompt('Please enter your name:',"") if (username!=null && username!=""){ setCookie('username',username,355) } } }
注意这里对Cookie的生存期进行了定义,也就是355天
3. localStorage
这是一种持久化的存储方式,也就是说如果不手动清除,数据就永远不会过期。 它也是采用Key - Value的方式存储数据,底层数据接口是sqlite,按域名将数据分别保存到对应数据库文件里。它能保存更大的数据(IE8上是10MB,Chrome是5MB),同时保存的数据不会再发送给服务器,避免带宽浪费。
3.1 localStorage的属性方法
下表是localStorge的一些属性和方法
属性方法
说明
localStorage.length |
获得storage中的个数 |
localStorage.key(n) |
获得storage中第n个元素对的键值(第一个元素是0) |
localStorage.getItem(key) |
获取键值key对应的值 |
localStorage.key |
获取键值key对应的值 |
localStorage.setItem(key, value) |
添加数据,键值为key,值为value |
localStorage.removeItem(key) |
移除键值为key的数据 |
localStorage.clear |
清除所有数据 |
3.2 localStorage的缺点
- ① localStorage大小限制在500万字符左右,各个浏览器不一致
- ② localStorage在隐私模式下不可读取
- ③ localStorage本质是在读写文件,数据多的话会比较卡(firefox会一次性将数据导入内存,想想就觉得吓人啊)
- ④ localStorage不能被爬虫爬取,不要用它完全取代URL传参
4. sessionStorage
和服务器端使用的session类似,是一种会话级别的缓存,关闭浏览器会数据会被清除。不过有点特别的是它的作用域是窗口级别的,也就是说不同窗口间的sessionStorage数据不能共享的。使用方法(和localStorage完全相同):
属性方法
说明
sessionStorage.length |
获得storage中的个数 |
sessionStorage.key(n) |
获得storage中第n个元素对的键值(第一个元素是0) |
sessionStorage.getItem(key) |
获取键值key对应的值 |
sessionStorage.key |
获取键值key对应的值 |
sessionStorage.setItem(key, value) |
添加数据,键值为key,值为value |
sessionStorage.removeItem(key) |
移除键值为key的数据 |
sessionStorage.clear |
清除所有数据 |
5. sessionStorage和localStorage的区别
-
sessionStorage用于本地存储一个会话(session)中的数据,这些数据只有在同一个会话中的页面才能访问并且当会话结束后数据也随之销毁。因此sessionStorage不是一种持久化的本地存储,仅仅是会话级别的存储。当用户关闭浏览器窗口后,数据立马会被删除。
-
localStorage用于持久化的本地存储,除非主动删除数据,否则数据是永远不会过期的。第二天、第二周或下一年之后,数据依然可用。
5.1 测试
sessionStorage:
if (sessionStorage.pagecount){ sessionStorage.pagecount=Number(sessionStorage.pagecount) +1; }else{ sessionStorage.pagecount=1; } console.log("Visits "+ sessionStorage.pagecount + " time(s).");
测试过程:我们在控制台输入上述代码查看打印结果
控制台首次输入代码:
关闭窗口,控制台再次输入代码:
所谓的关闭窗口即销毁,就是这样,关闭窗口重新打开输入代码输出结果还是上面图片的样子,也就是说关闭窗口后sessionStorage.pagecount即被销毁,除非重心创建。或者从历史记录进入才会相关数据才会存在。好的,我们再来看下localStorge表现:
if (localStorage.pagecount){ localStorage.pagecount=Number(localStorage.pagecount) +1; }else{ localStorage.pagecount=1; } console.log("Visits "+ localStorage.pagecount + " time(s).");
控制台首次输入代码:
关闭窗口,控制台再次输入代码:
6. web Storage和cookie的区别
Web Storage(localStorage和sessionStorage)的概念和cookie相似,区别是它是为了更大容量存储设计的。Cookie的大小是受限的,并且每次你请求一个新的页面的时候Cookie都会被发送过去,这样无形中浪费了带宽,另外cookie还需要指定作用域,不可以跨域调用。
除此之外,Web Storage拥有setItem,getItem,removeItem,clear等方法,不像cookie需要前端开发者自己封装setCookie,getCookie。
但是Cookie也是不可以或缺的:Cookie的作用是与服务器进行交互,作为HTTP规范的一部分而存在 ,而Web Storage仅仅是为了在本地“存储”数据而生
分享到:
相关推荐
在JavaScript中,Array对象是最常用的内置对象之一,它提供了存储一系列值的能力。有多种方式创建数组: 1. 使用`new Array()`构造函数,可以为空数组、指定数组长度或者传入初始元素。 2. 使用字面量语法`[]`,...
JavaScript作为一门面向对象的编程语言,它提供了多种本地对象供开发者使用。其中,Array对象作为常用的一种本地对象,常常被用来存储一系列的值。Array对象的使用,包括创建、属性、方法以及应用等方面的知识点,是...
第16章 本地存储与离线应用 535 16.1 Web Storage 536 16.2 Indexed数据库API 545 16.3 离线应用 564 16.4 本章小结 571 第17章 文件支持与二进制数据 572 17.1 HTML 5增强的文件上传域 573 17.2 ...
在实现自定义的Date.prototype.Format方法时,我们首先定义了一个对象o来存储日期的各个部分,例如月份(M+)、日期(d+)、小时(h+)、分钟(m+)、秒(s+)、季度(q+)以及毫秒(S)。接着,对于格式字符串fmt中...
以下是对“drupal学习小结、文档”中可能涉及的关键知识点的详细解释: 1. **Drupal安装**:首先,你需要下载最新版本的Drupal核心文件,然后上传到你的服务器或本地开发环境中。安装过程通常包括创建数据库、配置...
小结 使用 HTML、CSS 和 JavaScript,我们可以轻松地实现一个聊天室的展示界面。本文提供了一个简单的聊天室展示界面的示例代码,包括 HTML、CSS 和 JavaScript 代码。通过了解这些代码,我们可以更好地理解如何...
1.7 小结 23 第2章 PHP的基础语法 24 2.1 语言构成与工作原理 24 2.2 常量与变量 25 2.2.1 常量的定义 25 2.2.2 变量的定义 26 2.2.3 变量的作用域 27 2.2.4 动态变量 29 2.3 运算符和关键字 29 2.4 流程控制语法 30...
"国际化小结(更新中)"这个标题表明这是一篇关于国际化技术的总结性文章,可能包含了作者在实践中积累的经验和技巧,而且文章可能随着作者对i18n理解的深入而不断更新。 描述中提到的“博文链接:...
1. cookie概念:cookie是存储在客户端(用户浏览器)的一小段数据,由Web服务器发送到用户浏览器并保存在本地,随后浏览器每次向同一服务器发送请求时,都会将该段数据携带过去,用于识别用户或是存储用户的个性化...
不过,过多的全局变量可能导致状态管理混乱,因此,合理规划全局变量,适时使用本地存储或引入外部状态管理库(如Vuex的小程序版)是个好策略。 四、request重构 微信小程序内置了wx.request接口用于发送网络请求。...
《Android应用开发揭秘》全部实例源代码,配合《Android应用开发揭秘》使用 前言 第一部分 准备篇 第1章 Android开发简介 1.1 Android基本概念 1.1.1 Android简介 1.1.2 Android的系统构架 ... 17.4小结
作者简介 杨丰盛,Android应用开发先驱,对Android有深入研究,实战经验极其丰富。精通Java、C、C++等语言,专注于移动通信软件开发,在机顶盒软件开发和MTK平台软件开发方面有非常深厚的积累。... 17.4小结
《移动软件开发》结课作业“答案漂流瓶 Answer Drift Bottle”是一个基于JavaScript和微信小程序技术的项目。这个作业旨在让学生掌握移动应用开发的基本技能,特别是针对微信平台的小程序开发。下面将详细介绍该项目...
杨丰盛,Android应用开发先驱,对Android有深入研究,实战经验极其丰富。精通Java、C、C++等语言,专注于移动通信软件开发,在机顶盒软件开发和MTK平台软件开发方面有非常深厚的积累。2007年获得中国软件...17.4小结
作为基于分布式文件存储的数据库,在目前的云计算实践中,MongoDB炙手可热。《深入云计算(MongoDB管理与开发实战详解)》系统全面的介绍了MongoDB开发、管理、维护和性能优化等方方面面。...16.6 本章小结
22.2.1使用SharedObject本地存储 486 22.2.2用户登录示例 487 22.3小结 491 第23章网络通信 492 23.1处理外部数据 492 23.1.1请求与参数 492 23.1.2简单数据发送 493 23.1.3数据发送与载入 494 23.1.4图片载入示例 ...
组件内状态通常使用Vue的响应式系统直接管理,全局状态如使用Pinia或Vuex进行管理,数据存储则涉及到前端数据持久化的方法,比如使用本地存储(localStorage)、sessionStorage或者IndexedDB等。 以上就是从文件...
小结 今天我们讨论了 Cookies、SessionStorage 和 LocalStorage 的区别、相同点、使用场景及封装自定义LocalStorage。了解这些知识点对于前端开发者来说非常重要,可以更好地控制存储的数据和过期时间,提高应用...