浏览器存储方案

一:概述

在前端开发中,经常要用到浏览器存储,浏览器存储有如下作用:

  1. 可有效减少前后端交互;
  2. 可以实现跨页面传值;

二:浏览器端存储方案

按F12进入控制面板的application中,可以看到浏览器存储的项目,如下图:

1.cookie

    cookie 是服务器保存在浏览器的一小段文本信息。浏览器每次向服务器发出请求,就会自动附上这段信息。有些开发者使用 它作为客户端储存,这样做可行,但并不推荐,因为 cookie 的设计目标并不是这个,它的容量太小,每个 Cookie 的大小一般不能超过4KB,这个容量用于数据存储就太小气了。

保存位置:

  • 若未设置过期时间,则保存在 内存 中,浏览器关闭后销毁
  • 若设置了过期时间,则保存在 系统硬盘 中,直到过期时间结束后才消失(即使关闭浏览器)

    【浏览器每次向服务器发出请求,就会自动附上这段信息】,这句话其实不是绝对的,如果用户禁用了cookie功能(在浏览器的设置面板里可以禁用的),那么浏览器就可以即不接收服务器设置的cookie,同时发送给服务器的请求也不会携带cookie。

    通过window.navigator.cookieEnabled可以判断浏览器是否禁用了cookie功能,它的值是一个布尔值,只读。(true:表示浏览器启用了cookie功能;false:表示浏览器禁用了cookie功能)。

    不同浏览器对 Cookie 数量和大小的限制,是不一样的。一般来说,单个域名设置的 Cookie 不应超过30个,每个 Cookie 的大小不能超过4KB。超过限制以后,Cookie 将被忽略,不会被设置。

    浏览器的同源政策规定,两个网址只要【域名】相同和【端口】相同,就可以共享 Cookie。注意,这里不要求协议相同。也就是说,http://example.com设置的 Cookie,可以被https://example.com读取。

cookie并不一定非要服务器端生成,其实浏览器端同样能够生成,生成写入的信息介绍如下:

  • cookie 的名字(例:age)
  • cookie 的值(例:26)
  • expires:到期时间(值是 UTC 格式)。(例:Thu,01-Jan-2020 00:00:08 GMT)
  • max-age:指从现在开始 Cookie 存在的时间(单位:秒)。(例:300)功能类似于expires
  • domain:所属域名(默认是当前域名)
  • path:生效的路径(默认是当前网址)

最主要的设置就是前4项了,所属域名和生效路径一般就用默认的。

此外,设置max-age比设置expires更好,因为浏览器的时间是可以被更改的,不够可靠。

【读取】cookie方法:document.cookie;

  •   document.cookie会返回当前域名下的所有cookie(有个前提:该 Cookie 不能有HTTPOnly属性。)

【写入】cookie方法:document.cookie="name=张三;expires=Thu,01-Jan-2020 00:00:08 GMT"

  • 未设置的属性按默认的处理
  • 写入的时候,Cookie 值必须写成key=value的形式。注意,等号两边不能有空格。
  • 写入 Cookie 时若有分号、逗号和空格进行转义(它们都不允许作为 Cookie 的值)。
  • document.cookie一次只能写入一个 Cookie。

【删除】cookie方法:删除一个现存 Cookie 的唯一方法,是设置它的expires属性为一个过去的日期。

  • document.cookie="name=张三;expires=Thu,01-Jan-1990 00:00:08 GMT"

缺点:

  • 安全性差(因为每次前端发送请求都会带上cookie);
  • 浪费带宽(也是因为每次前端发送请求都会带上cookie);
  • 数据操作不方便,原生接口不友好,需要自己封装;

应用场景

  • 判断用户是否登陆过网站,以便下次登录时能够实现自动登录(或者记住密码)
  • 保存登录时间、浏览次数等信息

问题:既然cookie不适合做浏览器端的大量数据存储,那么一旦有这种需求,怎么办哪?

答:使用 Web storage和 IndexedDB。

2.sessionStorage 和 localStorage

    storage接口用于脚本在浏览器保存数据。有两个对象部署了这个接口:window.sessionStoragewindow.localStorage

    sessionStorage保存的数据用于浏览器的一次会话,当会话结束(通常是窗口关闭),数据被清空;

    localStorage保存的数据若不主动清空,则一直存在;

    除了保存期限的长短不同,这两个对象的其他方面都一致。

    storage接口很像 cookie 的强化版,能够使用大得多的存储空间。目前,每个域名的存储上限视浏览器而定,详见如下:

        --Chrome: 2.5MB;

        --Firefox:5MB;

        --Opera:5MB;

        --IE:10MB。

    storage接口提供了1个属性,5个方法。

    1个属性:length

        --window.sessionStorage.length;

        --window.localStorage.length;

    5个方法:

        --setItem(key, value);【写入】

        --getItem(key, value);【读取】

        --removeItem(key);   【删除指定的key名的storage】

        --clear();                    【删除所有的storage】

        --key(一个整数);        【返回参数对应的键名】

说明:除了key()方法,其它方法的参数都是字符串类型。

cookie 和 webStorage 存储数据格式仅支持 String,存储时需要借助 JSON.stringify() 将 JSON 对象转化为字符串,读取时需要借助 JSON.parse() 将字符串转化为 JSON 对象。

webStorage 有许多优点:

  • 保存在客户端,不与服务器通信,因此比 cookie 更安全、速度更快
  • 存储空间有限,但比 cookie 大(5MB)
  • 仅支持 String 类型的存储内容(和 cookie 一样)
  • html5 提供了原生接口,数据操作比 cookie 方便

问题:一般来说,我们更推荐使用 webStroage,但其存储大小有限、数据存储仅支持 String 格式、不提供搜索功能,不能建立自定义的索引,有没有更好的方案?

答: IndexedDB 可以担任该重任。

3.indexedDB

        通俗地说,IndexedDB 就是浏览器提供的本地数据库,它可以被网页脚本创建和操作。IndexedDB 允许储存大量数据,提供查找接口,还能建立索引。这些都是 LocalStorage 所不具备的。

        从 DB(Data Base) 可以看出它是一个数据库。常用的数据库有两种类型:

  • 关系型数据库:数据存储在表中,使用 sql 语句操作数据库,如:MySQLOracleWebSQL(已废弃)
  • 非关系型数据库:数据集作为 JSON 对象存储,不需要写sql 语句,如:RedisMongoDBIndexedDB

IndexedDB 是非关系型数据库,不需要写 sql 语句进行数据库操作,数据格式可使用 JSON 对象。

4.WebSQL(已废弃)

三:适用场景

  • cookie:短期登陆,例如:token 会过期,需要设置过期时间,过期后重新换取 token;
  • sessionStorage:敏感账号一次性登录、浏览器窗口关闭后数据被销毁;
  • localStorage:长期登录、判断用户是否已登录,适合长期保存在本地的数据;
  • indexedDB:存储大量结构化数据数据(但是由于前端安全问题,将大量结构化数据存在前端还是难以推行,对于大量结构化数据目前还是采用存后端比较常见)

四:总结

我们经常会听到有个session,这是个什么鬼,跟sessionStorage、cookie等有什么关系?

答:没有半毛钱关系。

session:

  • 是后端关心的内容,依赖于 cookie(sessionID 保存在cookie中)
  • 保存在服务端内存
  • 存储大小无限制
  • 支持任何类型的存储内容

cookie 存储量小、安全性差、数据操作接口不友好;

webStorage 存储量较大、安全性较高、数据接口友好;
若要持久的存储方式,推荐使用 localStorage
若要一次性会话的存储,推荐使用 sessionStorage

indexDB推广并不理想。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值