各种常用存储的storage(cookie,localStorage,sessionStorage,indexedDB)

目录

1.详解cookie

1.1cookie的一些操作

1.2cookie的一些特点

2.详解sessionStorage

2.1sessionStorage的特点

2.2sessionStorage的操作

3.详解localStorage

4.详解indexedDB

4.1创建数据库

4.2创建对象仓库

4.3对象仓库的操作

4.4游标cursor


1.详解cookie

HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话;服务端如果需要记录用户的状态,就使用response向客 户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务 器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容

1.1cookie的一些操作
document.cookie //获取cookie
document.cookie = "key=value" //添加cookie
//每个cookie都是由key=value组成的一个字符串,用逗号隔开的

//获取cookie里面的每个属性,返回一个对象
function getKeyAndValueObj(str) {
    let result, obj = {},
    reg = /[;\s]?(\w+)=([\w\.#]+)/g;
    while((result = reg.exec(reg)) != null) {
        let key = result[1];
        let value = encodeURIComponent(result[2])
        obj[key] = value
    }

    return obj
}

getKeyAndValueObj(document.cookie)
1.2cookie的一些特点

(1)存储大小不超过4kb

(2)cookie会与服务器通信,将Http协议变为有状态的连接;提供客户端与服务端通信;并在每次请求时,携带在请求头上

(3)cookie一般没有设置有效期,会在会话结束后;自动清除;若设置了有效期;

        1.通过expire设置过期时间;此时的date时格林日期格式

let _date = new Date() //获取当前时间
_date.setDate(_date.getDate() + 5) //当前时间的天数加5天,作为目标时间

let _ = _date.toGMTString() //转化为格林日期格式

document.cookie = "name=caicaizi, expires=_" //设置一个name=caicaizi的属性;过期时间为当前日期加5

        2.通过Max-Age来设置有效期,此时为秒数

document.cookie = "name=lili, Max-Age=60" //60秒后过期

(4)cookie只能存储字符串类型

(5)cookie具有不可跨域名性

(6)设置httpOnly属性,为true,不能通过js的document.cookie去获取,

(7)设置secure属性,为true,只能在https协议中携带cookie,为false,https和http都可以携带cookie

2.详解sessionStorage

sessionStorage的生命周期是仅在当前会话下生效,sessionStorage引入了一个“浏览器窗口”的概念,sessionStorage是在同源的窗口中始终存在的数据。只要这个浏览器窗口没有关闭,即使刷新页面或者进入同源另一个页面,数据依然存在。但是sessionStorage在关闭了浏览器窗口后就会被销毁。同时独立的打开同一个窗口同一个页面,sessionStorage也是不一样的;

2.1sessionStorage的特点

(1)页面会话在浏览器打开期间始终保持,页面刷新、重新加载或者回复都会保持原来的会话

(2)在新标签或窗口打开一个页面时,会复制顶级会话的session上下文,作为新的会话的上下文,通过open,标签_blank,location.href打开的新窗口,会复制父窗口的session,但是子窗口的session不能在父窗口获取

(3)打开多个相同的url或者浏览器tab标签栏,每个窗口的session不共享

(4)浏览器关闭后,session会清除

(5)session的存储大小为5MB

(6)同源限制:必须协议、域名、端口都相同,才能共用。

2.2sessionStorage的操作
sessionStorage.setItem("name", "caicaizi") //设置session
let session = sessionStorage.getItem("name") //获取
sessionStorage.removeItem("name") //清除

sessionStorage.clear() //清除所有的session

3.详解localStorage

localStorage基本同sessionStorage一样,只是localStorage时永久存储;浏览器关闭后,不会被清除

4.详解indexedDB

indexedDB内部采用对象仓库(objectStore)存放数据。所有类型的数据都可以直接存入,包括JavaScript对象。在对象仓库中,数据以“键值对”的形式保存,每一个数据都有对应的键名,键名是不能重复,否则会抛出一个错误。

indexedDB操作时不会锁死浏览器,用户依然可以进行其他操作,

indexedDB支持事务(transaction),这意味着一系列操作步骤之中,只要有一步失败,整个事务就都取消,数据库回到事务发生之前的状态,不存在只改写一部分数据的情况。

每一个数据库对应创建该数据库的域名。来自不同域名的网页,只能访问自身域名下的数据库,而不能访问其他域名下的数据库。

4.1创建数据库
window.indexedDB = window.indexedDB || window.webkitIndexedDB //兼容低版本chrome浏览器

var request = window.indexedDB.open(name, version)

var db;

request.onupgradeneeded = (e) => { //更新数据库时触发
    
}

reeust.onsuccess = (e) => { //创建成功触发
    db = e.target.result
}

request.onerror = (e) => { //失败时触发

}

1.window.indexedDB.open()有2个参数,第一个是数据库名字,第二个是版本,open方法若数据库存在,则打开该数据库,不存在,则创建一个

2.第一次打开数据库时获取更改版本号时,会触发onupgradeneeded函数,然后再触发success

3.回调函数接受一个事件对象event作为参数,它的target.result属性就指向打开的IndexedDB数据库。

4.数据库的version只能升,不能降,一个数据库,只能有一个版本,不能同时存在多个

4.2创建对象仓库
db = e.target.result //一个数据库

var data = [ //测试数据
     { id: "c1", name: "菜菜子", email: "1212@163.com", age: "18" },
     { id: "c2", name: "肖", email: "1213@163.com", age: "20" },
 ]

if (!db.objectStoreNames.contains("customer")) { //判断对象仓库存在不
var objectStore = db.createObjectStore("customer", { keyPath: "id", autoIncrement: true }) //创建一个对象仓库, 键为id, 自动递增

if(objectStore.indexNames.contains("name")) { //存在index
    objectStore.deleteIndex("name") //删除index
 }

objectStore.createIndex("name", "name", { unique: false }) //名字可以重复

objectStore.createIndex("email", "email", { unique: true }) // 邮箱不能重复

objectStore.transaction.oncomplete = (e) => { //确保对象仓库创建完成
    var customerObject = db.transaction("customer", "readwrite").objectStore("customer") //创建事务
     //数据保存到新建的对象仓库
     data.forEach((item) => {
         customerObject.add(item)
        })
       }
      }

1.db.objectStoreNames.contains 用于判断仓库是否存在

2.对象仓库的实例方法objectStore.indexNames.contains用于处理创建的index

3.对象仓库一旦创建成功,则不允许修改,除非更改版本号

4.3对象仓库的操作
let db = e.target.result.transaction(["customer"], "readwrite"); //创建一个可读写事务
            let store = db.objectStore("customer") //获取对象仓库
            store.add({ name:"test", age: 12, email: "11@163.com", id: "c3" })

1.transaction是数据库的事务,有2个参数,

        (1)第一个参数是数组,表示对象仓库

        (2)第二个参数是操作类型,readonly(只读),readwrite(读写)

        (3)transaction有三个方法来处理事务:abort: 事务中断; complete: 事务完成; error: 事务出错

2.对象仓库的方法

添加:add

修改:put

删除:delete

获取:get

清除所有:clear

4.4游标cursor
let res = store.openCursor(); //打开游标
            let result = [];
            res.onsuccess = (e) => {
              let cursor = e.target.result;
              if(cursor) {
                result.push(cursor.value);
                cursor.continue()
              } else {
                console.log("数据", result);
              }
            }
            db.oncomplete = () => {      
            }

1.openCursor打开一个游标,注意:存储数据的数组,必须定义在onsuccess的最外层;

2.游标本质上是一个迭代器,也就意味着有类似于 next 的方法,可以用来移动游标到下一个位置,有 value 属性用来读取当前值

3.continue滑动至下一条记录,当遍历结束后,会返回undefined

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CookieLocalStorageSessionStorage是在Web开发中常用存储数据的方式。 Cookie是一种存储在用户计算机上的小型文本文件,由服务器通过HTTP响应发送给浏览器,浏览器会将Cookie保存,并在后续的请求中通过HTTP头部发送给服务器。Cookie可以用来存储少量的数据,例如用户的身份认证信息、用户的偏好设置等。由于存储在客户端,因此可以在不同的会话之间持久保存。 LocalStorageSessionStorage是HTML5中新增的Web存储接口,都是在浏览器端进行数据存储的方式,不需要与服务器进行交互。它们使用相似的API,都可以存储大量的数据,并且保存在浏览器的本地环境中。 LocalStorageSessionStorage之间的主要区别在于数据的生命周期和作用域。LocalStorage保存的数据没有过期时间,除非用户手动删除,否则数据会一直保留。而SessionStorage保存的数据只在当前会话中有效,当用户关闭浏览器窗口或标签页时,数据会被清除。另外,LocalStorage的数据可以在同一个域名下的不同页面间共享,而SessionStorage的数据只能在同一个页面中共享。 总结: - Cookie是在服务器和浏览器之间传递的存储方式,用于存储少量数据。 - LocalStorageSessionStorage是在浏览器端进行数据存储的方式,可以保存大量数据。 - LocalStorage的数据没有过期时间,而SessionStorage的数据在会话结束时被清除。 - LocalStorage的数据可以在同一个域名下的不同页面间共享,而SessionStorage的数据只在同一个页面中有效。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值