热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

浅谈浏览器存储(cookie、localStorage、sessionStorage)

浅谈浏览器存储(cookie、localStorage、sessionStorage),Go语言社区,Golang程序员人脉社

今天我们从前端的角度了解一下浏览器存储,我们常见且常用的存储方式主要由两种:COOKIE、webStorage(localStorage和sessionStorage)。下面我们来一一认识它们。

 

COOKIE基于HTTP规范,用来识别用户。

COOKIE是服务器发送到浏览器的一小段数据,会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。

COOKIE诞生之初的作用就是解决HTTP的无状态请求,用来记录一些用户相关的一些状态。


  • 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)

  • 个性化设置(如用户自定义设置、主题等)

  • 浏览器行为跟踪(如跟踪分析用户行为等)

因为一些前端交互的需要,后来COOKIE也被用于存储一些客户端的数据。

COOKIE的原生api不友好,需要自行封装一下。下面是封装后的方法。


创建COOKIE


/**
* @description js原生设置COOKIE
* @param {String} name 给你要设置的COOKIE起个名字(key)
* @param {String} value COOKIE的具体内容(value)
* @param {String} expiredays 设置COOKIE的过期时间,单位:天
*/
function setCOOKIE(name, value, expiredays) {
var exdate=new Date();
exdate
.setDate(exdate.getDate() + expiredays);
document
.COOKIE = name + '=' + escape(value)+ ((expiredays == null) ? '' : ';expires=' +exdate.toGMTString());
}


获取COOKIE


/**
* @description js原生获取COOKIE方法1
* @param {String} name 你要获取的COOKIE名
*/
function getCOOKIE(name) {
  
if (document.COOKIE.length > 0) {
    
var start = document.COOKIE.indexOf(name + '=');
    
if (start !== -1) {
      start
= start + name.length + 1;
      
var end = document.COOKIE.indexOf(';', start);
      
if (end === -1) {
        
end = document.COOKIE.length;
        
return unescape(document.COOKIE.substring(start, end));
      }
   }
  }
  
return '';
}


/**
* @description js原生获取COOKIE方法2
* @param {String} name 你要获取的COOKIE名
*/
function getCOOKIE(name) {
  
var COOKIEArr = document.COOKIE.split(';') || [];
  
if(!COOKIEArr.length){
    
return '';
  }
  
for(var i = 0; i ){
    var key = $.trim(COOKIEArr[i]).split('=')[0];
    
var value = $.trim(COOKIEArr[i]).split('=')[1];
    
if(key === name){
      
return value;
    }
  }
}


检查COOKIE是否已存在


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,365);
    }
  }
}


jquery.COOKIE.js封装的COOKIE设置方法:


创建COOKIE


/**
* 'name', COOKIE命名
* 'value',COOKIE的值
* {
*   expires: 7, // COOKIE有效期,单位天;默认值:会话COOKIE,关闭浏览器COOKIE失效。
*   path: '/', // COOKIE影响到的路径;值为'/',表示设置COOKIE在整个域中可用;默认值:创建COOKIE的页面路径。
*   domain: 'example.com', // 定义COOKIE有效的域。默认值:创建COOKIE的页面域。
*   secure: false, // 定义COOKIE安全性,默认值:false,设置为true,则COOKIE在http中是无效的,COOKIE的传输需要使用安全协议(https)。
* }
*/
$
.COOKIE('name', 'value', { expires: 7, path: '/', domain: 'example.com', secure: false});


读取COOKIE


$.COOKIE('name'); //name存在返回对应value,不存在返回null


读取所有可用的COOKIEs:


$.COOKIE(); //{'name': value}

TODO:直接调用会报错?


删除COOKIE


//成功删除COOKIE时返回true,否则返回false

$
.removeCOOKIE('name'); // => true

$
.removeCOOKIE('nothing'); // => false


注意:删除COOKIE时,必须传递用于设置COOKIE的完全相同的路径,域和安全选项,除非您依赖于默认选项。
即:设置COOKIE时如果设置了path属性或secure属性,删除的时候要带着这些属性,否则无法成功删除COOKIE。
// This won't work!

$
.removeCOOKIE('name'); // => false
// This will work!


$
.removeCOOKIE('name', { path: '/' }); // => true

TODO:$.removeCOOKIE无效?
(jquery1.9.1.js + jquery.COOKIE.js,插件无重复引用的情况,$.removeCOOKIE提示undefined)

 


webStorage基于HTML5规范

HTML5 提供了两种在客户端存储数据的新方法:localStorage和sessionStorage,挂载在window对象下。

webStorage是本地存储,数据不是由服务器请求传递的。从而它可以存储大量的数据,而不影响网站的性能。

Web Storage的目的是为了克服由COOKIE带来的一些限制,当数据需要被严格控制在客户端上时,无须持续地将数据发回服务器。比如客户端需要保存的一些用户行为或数据,或从接口获取的一些短期内不会更新的数据,我们就可以利用Web Storage来存储。


localStorage的生命周期是永久性的。localStorage存储的数据,即使关闭浏览器,也不会让数据消失,除非主动的去删除数据。如果 想设置失效时间,需自行封装。

sessionStorage 的生命周期是在浏览器关闭前。

  特性:


  • 关闭浏览器sessionStorage 失效;

  • 页面刷新不会消除数据;

  • 只有在当前页面打开的链接,才可以访sessionStorage的数据,使用window.open打开页面和改变localtion.href方式都可以获 取到sessionStorage内部的数据;

 


总结:
















存储方式


作用与特性


存储数量及大小


api


COOKIE


● 存储用户信息,获取数据需要与服务器建立连接。

● 可存储的数据有限,且依赖于服务器,无需请求服务器的数据尽量不要存放在COOKIE中,以免影响页面性能。

● 可设置过期时间。


● 最好将COOKIE控制在4095B以内,超出的数据会被忽略。

● IE6或更低版本最多存20个COOKIE; IE7及以上版本最多可以有50个;Firefox最多50个;chrome和Safari没有做硬性限制。


原生、$.COOKIE(详见上文)


localStorage


● 存储客户端信息,无需请求服务器。

● 数据永久保存,除非用户手动清理客户端缓存。

● 开发者可自行封装一个方法,设置失效时间。

 


5M左右,各浏览器的存储空间有差异。(感兴趣的同学可以自己试一下)。


// 保存数据到 localStorage

localStorage.setItem('key', 'value');

// 从 localStorage 获取数据

let data = localStorage.getItem('key');

// 从 localStorage 删除保存的数据

localStorage.removeItem('key');

// 从 localStorage 删除所有保存的数据

localStorage.clear();


sessionStorage


● 存储客户端信息,无需请求服务器。

● 数据保存在当前会话,刷新页面数据不会被清除,结束会话(关闭浏览器、关闭页面、跳转页面)数据失效。

 


同localStorage


// 保存数据到 sessionStorage

sessionStorage.setItem('key', 'value');

// 从 sessionStorage 获取数据

let data = sessionStorage.getItem('key');

// 从 sessionStorage 删除保存的数据

sessionStorage.removeItem('key');

// 从 sessionStorage 删除所有保存的数据

sessionStorage.clear();


 


参考文档:

COOKIE API

https://developer.mozilla.org/en-US/docs/Web/HTTP/COOKIEs

http://www.w3school.com.cn/js/js_COOKIEs.asp

https://github.com/carhartl/jquery-COOKIE#readme


webStorage

http://www.w3school.com.cn/html5/html_5_webstorage.asp

https://developer.mozilla.org/zh-CN/docs/Web/API/Web_Storage_API

 



推荐阅读
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • svnWebUI:一款现代化的svn服务端管理软件
    svnWebUI是一款图形化管理服务端Subversion的配置工具,适用于非程序员使用。它解决了svn用户和权限配置繁琐且不便的问题,提供了现代化的web界面,让svn服务端管理变得轻松。演示地址:http://svn.nginxwebui.cn:6060。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
  • 【爬虫】关于企业信用信息公示系统加速乐最新反爬虫机制
    ( ̄▽ ̄)~又得半夜修仙了,作为一个爬虫小白,花了3天时间写好的程序,才跑了一个月目标网站就更新了,是有点悲催,还是要只有一天的时间重构。升级后网站的层次结构并没有太多变化,表面上 ... [详细]
  • struts2重点——ValueStack和OGNL
    一、值栈(ValueStack)1.实现类:OGNLValueStack2.对象栈:CompoundRoot( ... [详细]
author-avatar
月曳柳覀梢
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有