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 相关文章推荐
基于jquery的时间段实现代码
Aug 02 Javascript
js图片向右一张张滚动效果实例代码
Nov 23 Javascript
基于JQuery实现的Select级联
Jan 27 Javascript
JS 动态加载js文件和css文件 同步/异步的两种简单方式
Sep 23 Javascript
vue2.0中goods选购栏滚动算法的实现代码
May 17 Javascript
VUE element-ui 写个复用Table组件的示例代码
Nov 18 Javascript
axios中cookie跨域及相关配置示例详解
Dec 20 Javascript
微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧滑动,右侧不动)
Jan 23 Javascript
Vue2.x通用条件搜索组件的封装及应用详解
May 28 Javascript
angular6开发steps步骤条组件
Jul 04 Javascript
浅谈Vue.use到底是什么鬼
Jan 21 Javascript
微信小程序拖拽排序列表的示例代码
Jul 08 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和ACCESS写聊天室(六)
2006/10/09 PHP
优化使用mysql存储session的php代码
2008/01/10 PHP
Laravel框架学习笔记(二)项目实战之模型(Models)
2014/10/15 PHP
PHP实现适用于文件内容操作的分页类
2016/06/15 PHP
拖拉表格的JS函数
2008/11/20 Javascript
网站导致浏览器崩溃的原因总结(多款浏览器) 推荐
2010/04/15 Javascript
Jquery中Ajax 缓存带来的影响的解决方法
2011/05/19 Javascript
读jQuery之五(取DOM元素)
2011/06/20 Javascript
图片延迟加载的实现代码(模仿懒惰)
2013/03/29 Javascript
浅谈JavaScript中Date(日期对象),Math对象
2015/02/05 Javascript
jquery实现点击其他区域时隐藏下拉div和遮罩层的方法
2015/12/23 Javascript
浅谈js中的三种继承方式及其优缺点
2016/08/10 Javascript
BootStrap与validator 使用笔记(JAVA SpringMVC实现)
2016/09/21 Javascript
微信公众号开发 实现点击返回按钮就返回到聊天界面
2016/12/15 Javascript
js实现登录注册框手机号和验证码校验(前端部分)
2017/09/28 Javascript
jQuery完成表单验证的实例代码(纯代码)
2017/09/30 jQuery
electron-vue开发环境内存泄漏问题汇总
2019/10/10 Javascript
理解JavaScript中的对象
2020/08/25 Javascript
[20:46]Ti4循环赛第三日VG vs DK
2014/07/12 DOTA
python实现2048小游戏
2015/03/30 Python
Python的Bottle框架中实现最基本的get和post的方法的教程
2015/04/30 Python
Python3安装Scrapy的方法步骤
2017/11/23 Python
Python File(文件) 方法整理
2019/02/18 Python
Python实现微信消息防撤回功能的实例代码
2019/04/29 Python
Python pickle模块实现对象序列化
2019/11/22 Python
Python如何基于selenium实现自动登录博客园
2019/12/16 Python
PyCharm使用Docker镜像搭建Python开发环境
2019/12/26 Python
Pytorch十九种损失函数的使用详解
2020/04/29 Python
使用HTML5和CSS3制作一个模态框的示例
2018/03/07 HTML / CSS
YSL圣罗兰美妆美国官网:Yves Saint Lauret US
2016/11/21 全球购物
亿阳信通股份有限公司C#笔试题
2016/12/06 面试题
中医药大学市场营销专业自荐信
2013/09/29 职场文书
三分钟演讲稿事例
2014/03/03 职场文书
学雷锋树新风演讲稿
2014/05/10 职场文书
2016教师给学生的毕业寄语
2015/12/04 职场文书
一次项目中Thinkphp绕过禁用函数的实战记录
2021/11/17 PHP