JavaScript学习教程之cookie与webstorage


Posted in Javascript onJune 23, 2019

cookie

由于http是无状态的协议,一旦客户端和服务器的数据交换完毕,就会断开连接,再次请求,会重新连接,服务器单从网络连接上是没有办法知道用户身份的。cookie就是为了解决此问题而产生的,每次新的用户请求时,便给用户颁发一个独一无二的身份证,下次访问,必须带上身份证,这样服务器就会知道是哪个用户进行了访问,针对不同用户,做出不同的响应cookie是一个很小的纯文本文件(最多为4K),是浏览器储存在用户的机器上的。储存一些服务器需要的信息,每次请求站点,会发送相应的cookie,这些cookie可以用来辨别用户身份信息等作用。

cookie的属性字段

props intro
name cookie的名称
value cookie的值
domain 可以访问cookie的域名
path 可以访问此cookie的页面路径
expires/Max-Age cookie有效的时间
Size cookie的大小
httpOnly js能否读取到cookie信息
secure 是否只能通过https来传递此条cookie

cookie是以纯文本的方式存储,即cookie的数据类型为String类型

document.cookie = 'name=userInfo'; // 设置cookie的name属性
document.cookie = 'username=Jack'; // 在cookie中存储了username信息
console.log(document.cookie); // name=userInfo; username=Jack
document.cookie = 'name=userInfo'; // 设置cookie的name属性
document.cookie = 'username=Amy'; // 在cookie中存储了username信息
console.log(document.cookie); // name=userInfo; username=Amy

通过上面的实例可以知道,给cookie赋值时是不会覆盖cookie的原有的值,当等号前的属性名相同时,才会将原来相同属性名的值覆盖为后来设置的值。注意,cookie的两个字段之间是通过一个分号和空格分隔,而不是只有一个分号

当要给cookie设置非自定义的属性字段时,需要通过字符串追加的方式

例如

let expireDate = new Date();
document.cookie += ";expires=" + expireDate.toString();

注意: ";expires="中的分号必须有,如果字段前不加分号则会认为这是一个自定义字段

domain

非顶级域名,如二级域名或者三级域名,设置的cookie的domain只能为顶级域名或者二级域名或者三级域名本身,不能设置其他二级域名的cookie,否则cookie无法生成。

顶级域名只能设置domain为顶级域名,不能设置为二级域名或者三级域名,否则cookie无法生成。

二级域名能读取设置了domain为顶级域名或者自身的cookie,不能读取其他二级域名domain的cookie。所以要想cookie在多个二级域名中共享,需要设置domain为顶级域名,这样就可以在所有二级域名里面或者到这个cookie的值了。

顶级域名只能获取到domain设置为顶级域名的cookie,其他domain设置为二级域名的无法获取。

总的来说就是,上级域名不能访问下级域名的cookie,下级域名可以读取自身及上级域名的cookie,同级域名的cookie不共享,即同级域名之间不能互相访问对方的cookie,只能访问自身的cookie。

path

path字段为可以访问此cookie的页面路径。 比如domain是abc.com,path是/test,那么只有/test路径下的页面可以读取此cookie。

expires/Max-Age

expires/Max-Age 字段为此cookie超时时间。若设置其值为一个时间,那么当到达此时间后,此cookie失效。不设置此字段时,默认值是Session,即当浏览器关闭(注意:不是浏览器标签页,而是整个浏览器) 后,此cookie失效。

let expireDate = new Date("2019-5-26T09:00:00");
document.cookie += ";expires=" + expireDate.toString();

若要删除某条cookie则设置此条cookie的expires为当前时间之前的时间的即可

let expireDate = new Date("1970-01-01T00:00:00");
document.cookie += ";expires=" + expireDate.toString();

size

Size字段 此cookie大小。

httpOnly

若此属性为true,则只有在http请求头中会带有此cookie的信息,而不能通过document.cookie来访问此cookie,设置为true可以减少受到Xss攻击的风险

secure

secure 字段 设置是否只能通过https来传递此条cookie

localstorage/sessionstorage

webstorage并不是要替代cookie,而是为了弥补随着web的发展,cookie在存储限制(存储容量最多为4k),安全性(在http协议中明文传输)存在的缺点而提出的

两者的API是相同的

function intro
setItem(key, value) 以键值对的形式保存一条数据
getItem(key) 根据键来获得值
removeItem(key) 根据键来删除一条数据
key(index) 根据索引获得键的名称
clear() 删除全部数据

两者都有length属性

sessionStorage.setItem("name", "Jack");
sessionStorage.setItem("phone", "18856894523");
console.log(sessionStorage.getItem('name')); // Jack
console.log(sessionStorage.key(0)); // name
console.log(sessionStorage.length); // 2
sessionStorage.removeItem('phone');
console.log(sessionStorage.length); // 1
sessionStorage.clear();    
console.log(sessionStorage.length); // 0

两者的比较

  • localStorage和sessionStorage都是用来存储客户端临时信息的对象。均只能存储字符串类型的对象,虽然规范中可以存储其他原生类型的对象,但是目前为止没有浏览器对其进行实现。
  • localStorage生命周期是永久,除非用户显示在浏览器提供的UI上清除localStorage信息,否则这些信息将永远存在。
  • sessionStorage生命周期为当前窗口或标签页,一旦窗口或标签页被永久关闭了,sessionStorage存储的数据就被清空了。
  • 不同浏览器无法共享localStorage或sessionStorage中的信息。
  • 相同浏览器的不同页面(页面属于相同域名和端口)间可以共享相同的localStorage
  • 不同页面或标签页间无法共享sessionStorage的信息。注意,页面及标签页仅指顶级窗口,如果一个标签页包含多个iframe标签且属于同源页面,那么他们之间是可以共享sessionStorage的。
  • 使用window.open打开页面和改变localtion.href方式都可以获取到sessionStorage内部的数据

cookie 与 webstorage的区别

存储限制

  • 每个domain中只能存储最多20条cookie,cookie数据不能超过4K
  • webStorage也有存储大小的限制,但是比cookie大得多,可以达到5M或更大

数据的有效期

  • sessionStorage:仅在当前的浏览器窗口关闭有效;
  • localStorage:始终有效,除非用户手动删除
  • cookie:cookie过期时间之前一直有效,即使窗口和浏览器关闭

作用域

  • sessionStorage:不在不同的浏览器窗口中共享,即使是同一个页面;
  • localStorage:同源窗口共享
  • cookie:同源窗口共享

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
简洁Ajax函数处理(示例代码)
Nov 15 Javascript
深入理解JavaScript系列(35):设计模式之迭代器模式详解
Mar 03 Javascript
javascript处理a标签超链接默认事件的方法
Jun 29 Javascript
Jquery zTree 树控件异步加载操作
Feb 25 Javascript
JS学习之表格的排序简单实例
May 16 Javascript
jquery将标签元素的高设为屏幕的百分比
Apr 19 jQuery
Vue.js手风琴菜单组件开发实例
May 16 Javascript
angularJS自定义directive之带参方法传递详解
Oct 09 Javascript
C#程序员入门学习微信小程序的笔记
Mar 05 Javascript
vue列表单项展开收缩功能之this.$refs的详解
May 05 Javascript
Vue使用vue-recoure + http-proxy-middleware + vuex配合promise实现基本的跨域请求封装
Oct 21 Javascript
vue学习笔记之Vue中css动画原理简单示例
Feb 29 Javascript
React组件对子组件children进行加强的方法
Jun 23 #Javascript
vue使用websocket的方法实例分析
Jun 22 #Javascript
JS实现简单的文字无缝上下滚动功能示例
Jun 22 #Javascript
js图片查看器插件用法示例
Jun 22 #Javascript
JS实现继承的几种常用方式示例
Jun 22 #Javascript
让 babel webpack vue 配置文件支持智能提示的方法
Jun 22 #Javascript
简单了解TypeScript中如何继承 Error 类
Jun 21 #Javascript
You might like
PHP实现分页的一个示例
2006/10/09 PHP
php数据库连接时容易出错的特殊符号问题
2010/09/01 PHP
Laravel 中获取上一篇和下一篇数据
2015/07/27 PHP
php正则匹配文章中的远程图片地址并下载图片至本地
2015/09/29 PHP
PHP实现求解最长公共子串问题的方法
2017/11/17 PHP
PHP延迟静态绑定使用方法实例解析
2020/09/05 PHP
Alliance vs AM BO3 第二场2.13
2021/03/10 DOTA
让innerHTML的脚本也可以运行起来
2006/07/01 Javascript
Firefox getBoxObjectFor getBoundingClientRect联系
2008/10/26 Javascript
jquery中dom操作和事件的实例学习-表单验证
2011/11/30 Javascript
jQuery表格插件datatables用法总结
2014/09/05 Javascript
JS访问SWF的函数用法实例
2015/07/01 Javascript
基于JavaScript短信验证码如何实现
2016/01/24 Javascript
jQuery 插件实现随机自由弹跳气泡样式
2017/01/12 Javascript
react中fetch之cors跨域请求的实现方法
2018/03/14 Javascript
vue填坑之webpack run build 静态资源找不到的解决方法
2018/09/03 Javascript
解决iview多表头动态更改列元素发生的错误的方法
2018/11/02 Javascript
详解ES6系列之私有变量的实现
2018/11/21 Javascript
JS替换字符串中指定位置的字符(多种方法)
2020/05/28 Javascript
Vue 实现创建全局组件,并且使用Vue.use() 载入方式
2020/08/11 Javascript
vue中使用router全局守卫实现页面拦截的示例
2020/10/23 Javascript
[10:14]2018DOTA2国际邀请赛寻真——paiN Gaming不仅为自己而战
2018/08/14 DOTA
[07:54]DOTA2-DPC中国联赛 正赛 iG vs VG 选手采访
2021/03/11 DOTA
tensorflow saver 保存和恢复指定 tensor的实例讲解
2018/07/26 Python
Python中的Numpy矩阵操作
2018/08/12 Python
Python下应用opencv 实现人脸检测功能
2019/10/24 Python
Python操作Sqlite正确实现方法解析
2020/02/05 Python
python实现拼接图片
2020/03/23 Python
使用opencv识别图像红色区域,并输出红色区域中心点坐标
2020/06/02 Python
升级keras解决load_weights()中的未定义skip_mismatch关键字问题
2020/06/12 Python
印度手工编织服装和家居用品商店:Fabindi
2019/10/07 全球购物
12岁生日感言
2014/01/21 职场文书
检讨书1000字
2014/10/11 职场文书
springboot中一些比较常用的注解总结
2021/06/11 Java/Android
python开发制作好看的时钟效果
2022/05/02 Python
JS精髓原型链继承及构造函数继承问题纠正
2022/06/16 Javascript