storage類型是來存儲名值對兒,是保存在瀏覽器端的,存儲爲key-value形式的。javascript
key:做爲存儲數據的標識(惟一且不可重複)html
value:存儲數據的內容(number/string)前端
該類型的實例對象有關於存儲的方法以下:java
(1) clear():刪除全部值。web
(2) getItem():根據指定的名字(key)獲取對應的值。json
(3) key(index):獲取index位置處的值的名字(key)。瀏覽器
(4) removeItem():刪除由name指定的名值對兒。緩存
(5) setItem(name,value): 爲指定的name 設置一個對應的值。安全
(6) Storage.length :返回一個整數,表示存儲在 Storage 對象中的數據項數量。這個是 Storage 對象的一個屬性,並且是一個 只讀 屬性bash
該類型只能存儲字符串,非字符串的數據會在存儲以前轉換成字符串。
sessionStorage對象存儲是web stroage機制的一種,該對象會給每個給定的源維持一個獨立的存儲區域,該區域在頁面會話期間可用(即只要瀏覽器處於打開狀態,包括頁面從新加載和恢復) sessionStorage對象是綁定在服務器會話的,因此當文件在本地運行的時候是不能跨頁面訪問的,使用服務器地址訪問時才能多頁面訪問。
在另外一個頁面打開是找不到這個值的: 開啓服務器訪問:再次使用服務器地址訪問的時候:
localStorage也是web Stroage存儲機制的一種,localStorage對象是根據glocalStorage對象設計出來的簡化,glocalStorage的使用是要指定哪些域名能夠訪問該數據,是經過方括號標記使用該屬性來實現的:
//存數據
glocalStorage["baidu.com"].name="劉德華"
//取數據
var name=glocalStorage["baidu.com"].name
複製代碼
聽網上說是爲了安全性而後在HTML5的規範中用localStorage取代了glocalStorage不能本身設置域名,值使用localStorage對象時就將當前域名加入。規則設計出來就是方便咱們的使用的,顯然localStorage比以前的使用起來更簡單了。
我本身的理解根據該用戶不刪除數據,數據將會一直保存在磁盤裏的屬性,能夠設置收藏列表,用戶愛好等等。
//存數據
glocalStorage.setItem('content', '劉德華');
//取數據
glocalStorage.getItem('content');
複製代碼
sessionStorage:數據只保持在瀏覽器關閉
localStorage:用戶不刪除數據,數據將會一直保存在磁盤裏
localStorage:只要在相同的協議、相同的主機名、相同的端口下,就能讀取和修改到同一份 localStorage 存儲的數據。
sessionStorage:除了協議、主機名、端口外,還要求在同一窗口下。
Last-Modified:響應頭,資源最新修改時間,由服務器告訴瀏覽器。 if-Modified-Since:請求頭,資源最新修改時間,由瀏覽器告訴服務器(其實就是上次服務器給的Last-Modified,請求又還給服務器對比),和Last-Modified是一對,它兩會在服務器端進行對比。
第一次請求數據
瀏覽器:服務器服務器,我如今須要一個users.json的文件,你找到了給我,順便給我文件修改時間!
服務器:行,文件修改時間我給你,到時候文件過時了咱兩覈對文件修改時間,對得上我就不找了,返回a.txt+Last-Modified。
第二次請求數據 瀏覽器:服務器服務器,我還須要一個users.json的文件,我把這個文件上次修改時間發你if-Modified-Since,你對比一下文件最近有不有修改!
服務器:ok,我幫你找一下。服務器將if-Modified-Since與Last-Modified作了個對比。
if-Modified-Since 與Last-Modified不相等,服務器查找了最新的users.json,同時再次返回全新的Last-Modified。
if-Modified-Since 與Last-Modified相等,服務器返回狀態碼304,文件沒修改過,你仍是用你的本地緩存。
Etag:響應頭,由服務器設置告訴瀏覽器。
if-None-Match:請求頭,由瀏覽器告訴服務器(其實就是上次服務器給的Etag),和Etag是一對,它兩也會在服務器端進行對比。
瀏覽器:服務器服務器,我如今須要一個users.json的文件,你找到了給我!
服務器:你又來了,文件我找給你,我給你一個Etag(文件版本號),到時候你再來找這個資源的時候把這個帶上,省的我再找給你,返回a.txt+Etag。
第二次請求數據 瀏覽器:服務器服務器,我又須要users.json文件了,我把你發給個人Etag放在If-None-Match裏面了,你對比一下最近這個文件有不有修改!
服務器:ok,我幫你找一下。服務器將Etag與If-None-Match作了個對比。 Etag與If-None-Match不相等,服務器查找了最新的users.json,同時再次返回全新的Etag(文件版本號)。
Etag與If-None-Match相等,服務器返回狀態碼304,文件沒修改過,你仍是用你的本地緩存。
<ul id="users"></ul>
<script> window.onload = function() { const users = JSON.parse(localStorage.getItem('usersdata')); console.log("users", users) const uluser = document.querySelector('#users'); if (users) { uluser.innerHTML = users.map(user => ` <li> ${user.username}-${user.place} </li> ` ) } fetch('/users') .then(data => data.json()) .then(data => { localStorage.setItem('usersdata', JSON.stringify(data)) //須要存儲字符串 console.log("users請求") uluser.innerHTML = data.map(user => ` <li> ${user.username}-${user.place} </li> ` ) }) } </script>
複製代碼
const http = require('http');
const fs = require('fs');
const users = require('./users.json')
http.createServer((req, res) => {
let status = fs.statSync('users.json');//獲取文件的狀態
if (req.url == '/') {
res.writeHead(200, { "Content-Type": "text/html;charset=utf8" })
fs.createReadStream('./users.html')pipe(res);//經過流返回顯示頁面
} else if (req.url == '/users') {
console.log("用戶數據請求")
if (req.headers['if-modified-since']) {
if (req.headers['if-modified-since'] == status.mtime) {//判斷請求中的修改時間與文件的修改時間是否相同
console.log("未修改文件返回304")
res.writeHead(304, { "Content-Type": "text/html;charset=utf8" });//304 Not Modified
res.end();
return;
} else {
res.setHeader('Last-Modified', status.mtime);
res.writeHead(200, { "Content-Type": "text/html;charset=utf8" });
console.log('修改了返回修改數據')
res.end(JSON.stringify(users))
return;
}
}
console.log("用戶數據第一次")
res.setHeader('Last-Modified', status.mtime);
res.writeHead(200, { "Content-Type": "text/html;charset=utf8" });
res.end(JSON.stringify(users))
} else {
res.end("null")
}
}).listen('8088', () => {
console.log('監聽8088')
})
複製代碼
第一次請求數據服務器給咱們返回200狀態碼和Last-Modified,代碼中提示的地方提示出用戶爲第一次數據請求。
文件未修改,第二次請求數據服務端判斷出文件未修改,則返回304狀態碼官方解釋304:The HTTP 304 Not Modified client redirection response code indicates that there is no need to retransmit the requested resources.
文件修改,再次訪問,服務端檢測文件修改時間不同,則從新返回文件內容緩存數據能夠節省許多資源,對於以上例子還有些缺陷,對於高頻訪問狀況仍是不能知足需求,技術就是須要不斷的探索。有什麼建議或者錯誤,歡迎指出!