session

session是在服务端保存数据的一个结构,用来跟踪用户状态。这个数据可以保存在集群、数据库、文件中。 由于http是无状态的协议,所以当服务端需要记录用户状态的时候,就需要某种机制来识别具体的用户,这个机制就是session. 服务端为特定的用户创建特定的session,用于识别并跟踪这个用户。(比如用户向购物车里添加几件物品,就需要session来记录用户状态。)

cookie是保存用户信息的一种机制,用来记录用户的一些信息,也是实现session的一种方式。 cookie是服务端如何识别特定用户的,每次http请求的时候,客户端都会发送相应的cookie到服务端,大多数应用都是用cookie来实实现session跟踪的,第一次创建session的时候,服务器会在http协议中告诉客户端,需要在cookie里记录一个session ID,以后每次请求都会把这个会话ID带到服务端。

cookie中包括名称、值、过期时间、域、路径、安全标志这几个部分。 例: Set-Cookie: name = "Liu";expires: Mon,29-03-2017 00:00:00 GTM;domain="baidu.com";path=/;secrue

如果客户端禁用了浏览器,一般会使用URL重写技术来进行会话跟踪,即每次http交互,url后都会加一个uid=xxxx的参数。

storage

web storage是在客户端存储数据,storage是为了解决cookie的限制。当数据严格控制在客户端时,可以不用通过http来持续将数据发送给服务器

Storage作为Web Storage API 的接口,提供了访问特定域名下的会话存储(session storage)或本地存储(local storage)的功能,可以添加、修改、删除存储的数据项

storage 相关方法

  • storage.clear() 清空存储对象里所有键值

  • storage.getItem(keyName) 获取对应键名的键值

  • storage.setItem(keyName, keyValue) 设置对应键名的键值

  • storage.removeItem() 清空对应键名的键值

  • storage.key(n) 获取存储对象中第N个数据项键名

// 定义设置、获取以及清空本地存储数据项的对象方法

const storage = {
  // storage.get为方法名,key为方法接收的参数
  get: key => {
    // 以js对象形式返回想要获取的数据项的值
    // JSON.parse() 用于将一个JSON字符串 转换为js对象
    return JSON.parse(localStorage.getItem(key)) || null
  },
  set: (key,val) => {
    // 以JSON字符串形式存储数据项
    // JSON.stringify() 用于将js值转换为JSON字符串
    return localStorage.setItem(key, JSON.stringify(val))
  },
  remove: key => {
    localStorage.removeItem(key)
  },
  clear: () => {
    localStorage.clear()
  }
}

export default storage

// 调用storage方法

import storage from 'storage'
// 页面加载后先判断缓存里有没有所需数据,如果有就直接使用缓存数据项,如果没有再请求接口数据
if (storage.get('proctInfo')) {
  this.rate = proctInfo.rate
} else {
  queryProduct().then((res) => {
    storage.set('proctInfo', res)
  }).catch((err) => {
    alert(err)
  })
}

sessionStorage、localStorage和cookie之间的相同点

都是保存在浏览器端,且同源的(同源即指相同的url,主机名,端口号,对于普遍依赖于cookie维护授权用户session的现代浏览器来说,这种机制有特殊意义。客户端必须在不同站点提供的内容之间维持一个严格限制,以防丢失数据机密或者完整性。)

sessionStorage、localStorage和cookie之间的区别

  • 传递方式不同 cookie数据始终在同源的http请求中携带(即使不需要),即cookie总在浏览器和服务器间来回传递,sessionStorage和localStorage不会自动把数据发送给服务器,仅在本地保存,不进行传递。

  • 存储空间不同 cookie数据不能超过4k,只适合保存很小的数据。 sessionStorage和localStorage存储大小比cookie大的多,可以达到5M或更大。

  • 数据有效期不同 sessionStorage仅在浏览器窗口关闭前有效,不可能永久保持 localStorage始终有效,浏览器或窗口关闭也一直保存,因此用作持久数据 cookie只在过期之前的时间内一直有效,即使窗口或浏览器关闭。

  • 作用域不同 sessionStorage不在不同的浏览器窗口中共享,即使是两只一个页面 localStorage在所有同源窗口中都是共享的 cookie也是在所有同源窗口中都是共享的。

  • cookie数据还有路径的概念,即可以限制cookie只属于某个路径下。