HTTP Cookie(也叫Web Cookie或浏览器Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。javascript
cookie,指网站为了辨别用户身份而储存在用户本地终端上的数据。cookie 本质上是 HTTP 的一个内容(请求头)。
在前端工做中,能够这么理解 cookie:php
cookie 通常有两个做用:html
能够这么理解:浏览器访问过服务器以后,服务器就会发送一个特殊的身份信息给浏览器。当浏览器再次访问服务器时,会强制要求带上身份信息,而服务器也能够经过本身颁发出去的身份信息来识别浏览器,而这个身份信息就是cookie。 活生生的例子:前端
学校的门卡:第一次去学校,没有门卡。而后,学校给发了一个门卡,门卡里面有你的姓名、班级等信息。学校规定,有门卡的必须带门卡上学,你带上门卡到学校门口刷卡,学校就能知道你是谁,你来上课了。java
接下来,以client指代客户端,server指代服务端,说明一个 cookie 的整个做用机制:node
因为 cookie 是__明文__保存在客户端的数据,可能会被客户端修改,存在信息泄露的风险,因此,须要一种比 cookie 更加安全的存储方式来存储数据。session 就是解决安全问题的方法。web
来自维基百科的解释:ajax
在计算机科学领域来讲,尤为是在网络领域,会话(session)是一种持久网络协议,在用户(或用户代理)端和服务器端之间建立关联,从而起到交换数据包的做用机制,session在网络协议(例如telnet或FTP)中是很是重要的部分。算法
我的理解: session 是一种在服务器端保存数据的机制。服务器经过读取浏览器发送的 cookie 和 服务器端的 session 来交换数据。
不一样于 cookie,session保存在服务器端,不一样的语言保存方式不同:后端
session 的做用和 cookie 的做用大体相同。最大的不一样点在于二者的安全性和实现方式。文章下面会介绍。
依然将客户端称为 client,服务端成为 server,一块儿了解一下 session 的工做流程:
cookie:sessionID=135165432165
localStorage 是 HTML5 提供的一个 API。
localStorage 的实质是一个hash(哈希表),是一个存在于浏览器上的 hash(哈希表)。 localStorage 提供了几个 API 来添加、读取、删除 localStorage:
localStorage.setItem('姓名','萧XX')
console.log(localStorage) // Storage {姓名: "萧XX", length: 1}
复制代码
localStorage.getItem('姓名') // "萧XX"
复制代码
localStorage.removeItem('姓名')
console.log(localStorage) // Storage {length: 0}
复制代码
localStorage.clear()
console.log(localStorage) // Storage {length: 0}
复制代码
localStorage 是一个保存于客户端的哈希表,能够用来本地保存一些数据。
let a = localStorage.getItem('a')
if(!a){
a = 0
}else{
a = (+a) + 1
}
console.log(a) // 0
localStorage.setItem('a', a)
console.log(localStorage.getItem('a')) // 0 , 变量 a 被保存到 localStorage 中了
// 刷新页面,这时候会打印出 两行 1 ,说明变量 a 的值被读取以后又从新赋值了
复制代码
典型应用:
记录是否提示过:若是不使用localStorage 持久化存储,每次刷新页面都会弹出提示
let already = localStorage.getItem('提示')
if(!already){
alert("这是咱们的提示内容")
localStorage.setItem('提示',true)
}
复制代码
sessionStorage 的全部性质基本上与 localStorage 一致,惟一的不一样区别在于:
sessionStorage 的有效期是页面会话持续,若是页面会话(session)结束(关闭页面),sessionStorage 就会消失。而 localStorage 则会一直存在。
Cache-Control 通用消息头被用于在http 请求和响应中经过指定指令来实现缓存机制。缓存指令是单向的, 这意味着在请求设置的指令,在响应中不必定包含相同的指令。
理解:
Cache-Control 第一次请求资源时,将资源缓存下来。告诉浏览器再次须要该资源时,不要向服务器请求资源,而是直接使用缓存的资源。Cache-Control 是控制缓存的 HTTP 内容(请求头/响应头)。
Cache-Control 有 2 种使用方式:
request.setHeader('Cache-Control','max-age=99999999') // 将这次请求的资源缓存 99999999 秒
复制代码
response.setHeader('Cache-Control','max-age=99999999') // 将这次请求的资源缓存 99999999 秒
复制代码
Cache-Control 使用缓存机制,用来缩短二次访问的响应时间,提升页面响应性能,实现web性能优化。
<script src='./js/main.js?v=1.0'></script> <!-- 第一个版本的js,能够被缓存 -->
<script src='./js/main.js?v=1.1'></script> <!-- 第二个版本的js,浏览器会再次请求资源 -->
复制代码
在真正的开发中,资源版本号通常都是使用摘要算法生成的字符串。(md5算法转换的字符串)
Expires 是之前版本的缓存控制,若是你设置了 Cache-Control,那么 Expires 会失效。
Expires 头指定了一个日期/时间, 在这个日期/时间以后,HTTP响应被认为是过期的;
Expires 工做原理与 Cache-Control 差很少。区别不一样的是,Expires 设置的缓存时间是一个时间点,过了这个时间点,缓存就过时。
Expires: Expires 使用的是本地时间,会受本地事件影响。
response.setHeader('Expires: Wed', '21 Oct 2019 07:28:00 GMT') // Expires 使用格林梅治事件,GMT
复制代码
Cache-Control 和 Expires ,优先使用 Cache-Control
ETag HTTP响应头是资源的特定版本的标识符。 Etag 是 HTTP 的内容,经过匹配标识符来判断资源是否须要下载。
The Last-Modified 是一个响应首部,其中包含源头服务器认定的资源作出修改的日期及时间。
通俗地讲:last-Modified 是一个响应头,它的值是:资源最后一次被修改的时间。
session 实现关键是 sessionID,只须要将 sessionID 传递给浏览器,浏览器在请求的时候再将 sessionID 传递给服务器,就能够实现 session。因此,可使用在 URL 中插入查询参数的方式来实现 sessionID 的传递。
第一步:服务端(node)直接将 sessionID 用 JSON 传给前端
let sessionID = Math.random() * 10000000
response.write(`{"sessionID":${sessionID}}`)
复制代码
第二步:前端处理:将获取的 JSON 解析出来,获取 sessionID,跳转页面的时候,将sessionID写到查询参数之中
let object = JSON.parse(request.responseText)
// 将 sessionID 存到 localStorage 中备用
localStorage.setItem('sessionID',object.sessionID)
window.location.href = `/?sessionID=${}`
复制代码
第三步:服务器端获取查询参数,使用查询参数之中的 sessionID 去使用 session
ley sessionID = query.sessionID // query 为查询参数
复制代码