11. cookie_session_原生ajax_readyState的值_同源策略_跨域_jsonp的使用
1. cookie
瀏覽器儲存技術。(伺服器將少量資料交於瀏覽器儲存管理)
作用: 儲存資料, 解決 http 協議無狀態問題
工作流程:
瀏覽器傳送請求給伺服器,請求登入
伺服器返回響應給瀏覽器,此時攜帶了cookie(其中包含著當前使用者的唯一標識)
瀏覽器接受到響應中cookie,得儲存下來
瀏覽器下一次傳送請求時,會自動攜帶上cookie,
伺服器接受到請求,解析cookie,從而判斷是哪個使用者傳送的請求(解決http協議無狀態問題)
伺服器端的使用:
設定cookie res.cookie(key, value, options)
獲取cookie 引入第三方中介軟體解析 cookie-parser req.cookies
清除瀏覽器cookie res.clearCookie(key)
前端使用:
document.cookie 讀寫二合一
清除 document.cookie = 'hello=123;expires=' + new Date(Date.now() - 1000);
特點:
cookie 數量有限制,同一個域名下大約 20 個左右(不同瀏覽器不一樣)
cookie 大小有限制,每一個 cookie 最大值大約 4kb 左右(不同瀏覽器不一樣)
2. session
也是一種解決http協議無狀態問題的方案
不同的是:
session儲存位置是伺服器
儲存大小近乎無限
傳輸流量更小(只產生一個cookie)
3. 請寫出原生 ajax
① 建立xhr物件
② 繫結事件監聽
onreadystatechange 會監聽readyState值的變化,一旦發生變化,就會觸發當前事件
③ 設定請求資訊
xhr.open(請求方式, 請求地址(get請求引數在這寫, 以查詢字串的方式))
④ 傳送請求
xhr.send(body(post請求的請求體引數));
問題:
chrome 和 firefox: 第二次 get 請求預設走協商快取,狀態碼 304,還是會向伺服器傳送請求
ie:第二次 get 請求預設走強制快取,狀態碼 200,不會向伺服器發請求
解決:讓每一次請求不一樣,只要請求不一樣,就不會走快取
4. 談談readyState的值
0: xhr 物件建立成功,但是 xhr.open() 方法還未呼叫
1: xhr.open() 方法已經呼叫了,但是還未呼叫 xhr.send() 方法(意味著還沒有傳送請求,還可以設定請求頭資訊)
2: xhr.send() 方法已經呼叫了,接受到了部分響應資料(響應首行和響應頭)
3: 接受了響應體資料(如果響應體資料較小或者是純文字,在此階段就全部接受完了)
4: 接受了全部響應體資料(資料較大或者音視訊資源等)
5. 跨域
同源: 協議、域名、埠號 必須完全相同
同源策略 (Same-Origin Policy) 最早由 Netscape 公司提出,是瀏覽器的一種安全策略
違背同源策略就是跨域
解決最終原理:繞過瀏覽器的 ajax 引擎就 ok,所以後面還有伺服器代理模式、Nginx 反向代理等方案
解決方案:
- jsonp
利用 script 標籤能夠跨域的特性解決跨域的
只能傳送 get 請求, 相容性好
步驟:
① 建立 script 標籤
② 設定響應成功的回撥函式
③ 設定 script 的src 屬性
④ 將 script 新增到頁面中生效
⑤ 伺服器必須響應 callback(data) 格式資料
- cors
ing... ...