HTTP的格式
HTTP請求由四部分組成,分別是狀態行,請求頭,回車,請求正文
- 狀態行:請求格式Method 資源路徑URL 協議/版本號
- 請求頭:包含訪問的域名,Cookie,Content-Type,Content-Length等資訊
- 回車
- 請求正文:就是HTTP向服務端傳送的資料
1 動詞 路徑 協議/版本
2 key1:value1
2 key2:value2
2 key3:value3
2 Content-Type:application/x-www-form-urlencoded
2 Host:www.baidu.com
2 User-Agent:curl/7.54.0
3 回車用來區分請求頭和請求正文
4 要上傳的資料
複製程式碼
- 請求最多包含4部分,最少包含3部分(也就是請求正文部分可以為空)
- 第三部分永遠是一個回車,用來區分第三部分和第四部分
- 動詞有GET POST PUT PATCH DELETE HEAD OPTIONS等
- 這裡的路徑包括【查詢引數】,但不包括【描點】
- 如果沒有寫路徑,那麼路徑預設為
/
- 第2部分中的Content-Type標註了第4部分的格式
HTTP響應格式與請求格式一樣
在http的響應中
Content-Length:響應正文的長度,單位為KB
Content-Type:text/html 響應正文的格式
複製程式碼
HTTP狀態碼
- 1xx Http請求已經接受,繼續處理請求
- 2xx 表示成功
- 3xx 重定向
- 4xx 客戶端錯誤
- 5xx 服務端錯誤
常見狀態碼的含義:
- 200---請求正常處理完成
- 301---永久重定向
- 302---臨時重定向
- 304---請求正確,而服務端的資源沒有改變,則直接用本地快取的資源
- 400---客戶端語法錯誤
- 401---請求未經授權
- 403---請求被拒,沒有訪問許可權
- 404---請求的url不存在
- 500---服務端永久錯誤
- 503---服務端發生臨時錯誤
Cookie特點
- 服務端通過設定響應頭的Set-Cookie來設定Cookie
//這裡用node演示
res.setHeader('Set-Cookie','user=admin');
複製程式碼
- 瀏覽器得到Cookie之後,每次請求都會帶上Cookie
- 服務端讀取到http請求中的cookie就知道了登入使用者的資訊
if(req.headers.cookie.user=='admin'){
res.end("歡迎管理員");
}
複製程式碼
cookie存在的問題:
- 不同瀏覽器不能公用同一個cookie,我在chrome拿到的cookie不能在Safrai上使用
- Cookie可以隨便改,不安全
- Cookie存在盤的一個資料夾裡
- 設定了cookie後,所有請求都會帶上cookie
- cookie有效期預設是20分鐘,後端可以強制改變時期
res.setHeader("Set-Cookie",'user=admin;max-age=300000;httpOnly');
//max-age可以改變cookie的有效期
//httpOnly禁止使用者操作cookie
複製程式碼
session和cookie的關係
為了不讓使用者去篡改cookie的值,我們可以把cookie的值存在服務端的一塊記憶體中,這塊記憶體叫做session,而拿到該cookie的值,需要一個隨機的key值
let sessionId = Math.random()*100000;
sessions[sessionId] = {user:admin};
res.setHeader('Set-Cookie',`sessionId=${sessionId}`);
//當瀏覽器再次傳送請求時,就會帶上sessionId
let sessionId = req.headers.cookie.sessionId;
let user = sessions[sessionId]
if(user=='admin'){
res.end("歡迎管理員");
}
複製程式碼
- 所以session是基於cookie的,
- session是佔用伺服器記憶體的
- 當這個隨機數越大,使用者越不可能拿到別的使用者的cookie值
Http快取
web效能優化裡有設定HTTP快取這一條,不過是後端操作的
res.setHeader('Cache-Control','max-age=300');
//在30秒內,相同路徑的http請求會指向本地的快取,
//不會真正的傳送請求,
//這一塊在不斷重新整理網頁時,我希望之前已經請求的資源不用再次請求時,可以設定
//首頁一般不會設定http快取,不然使用者不知道你網頁更新的訊息
複製程式碼
localStorage是啥
localStorage是H5新出的api,可以用來設定本地快取
- localStorage.getItem('name') 獲取快取內容
- localStorage.setItem('name','hzw') 設定快取
- localStorage.clear()清除所有快取
注意:
localStorage只能存String
所有存進去的內容,都會自動呼叫toString()的方法
localStorage.setItem('name',{name:'hzw'});
//({}).toString() [object Object]
複製程式碼
如果真的需要存進物件,那麼就用json格式的
localStroage.setItem('name',JSON.stringify({name:'hzw'}));
//
複製程式碼
應用場景:
localStorage一般用來持久化儲存資訊
var a = 1;
//在瀏覽器的視窗把a改為2;
//但再次重新整理網頁時,a又變為了1
//這就不能持久化的儲存資訊
複製程式碼
let a = localStorage.getItem('a');
if(!a){
a=1;
}else{
a=(Number)a+1;
}
localStorage.setItem('a',a);
//每次重新整理網頁,a就會加1,這就是持久化儲存資訊
複製程式碼
提示頁面只提示一次
let already = localStorage.getItem('已經提示');
if(!already){
localStorage.setItem('已經提示了',true);
alter("該網頁已經改版");
}
複製程式碼
localStorage的特點:
- 跟HTTP無關
- HTTP不會帶上localStorage
- 只有相同的域名的頁面才能互相讀取localStorage
- 每個域名localStorage最大儲存量5MB左右
- 永久有效,除非手動清除快取
sessionStorage也是H5的api
呼叫跟localStorage一樣,特點只有第5條不同,sessionStorage在使用者關閉頁面時,就失效
結語
這是一篇筆記,寫得不是很好,如果有錯誤的地方,還請看官們指正!感激不盡!