1. 程式人生 > >11. cookie_session_原生ajax_readyState的值_同源策略_跨域_jsonp的使用

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... ...