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 爲查詢參數
複製代碼