成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Cookie在前端中的實踐

開發 前端
每個 Cookie 都有一定的屬性,如什么時候失效,要發送到哪個域名,哪個路徑等等。在設置任一個 Cookie 時都可以設置相關的這些屬性,當然也可以不設置,這時會使用這些屬性的默認值。

對于很多不了解后端的前端er來說,很多涉及后端的知識點都是一道坎,因為不懂后端,所以很多知識都只能在文章上得到,卻很少有機會實踐,導致很多這塊的知識點都是模模糊糊的。在這里,推薦大家去學習一下 Node.js,嘗試一下就知道,用 Node.js 搭建一個 mock 服務器是多么簡單的一件事情,新世界的大門就此敞開。

廢話說太多了,回到本篇文章的主題,來玩玩 Cookie。

環境配置

在開始聊 Cookie 之前,我們需要搭建一個本地服務器,我們將用這個服務器來操作 Cookie。

  1. // 首先打開命令行工具,執行下面一些列命令 
  2.  
  3. mkdir cookie-demo && cd cookie-demo 
  4. npm init 
  5. npm install express --save 
  6. touch main.js  

執行完上面一系列的命令之后,你就能看到如下的文件結構,我們需要操作的文件就是 main.js

  1. cookie-demo 
  2. |- main.js 
  3. |- node_modules 
  4. |- package.json  

打開 main.js,并在 main.js 寫入以下代碼:

  1. const express = require('express'
  2. const app = express() 
  3.  
  4. app.listen(3000, err => { 
  5.   if (err) { 
  6.     return console.log(err) 
  7.   } 
  8.   console.log('---- 打開 http://localhost:3000 吧----'
  9. }) 
  10.  
  11. app.get('/', (req, res) => { 
  12.   res.send('<h1>hello world!</h1>'
  13. })  
  1. // 在命令行執行 
  2.  
  3. node main.js 
  4.  
  5. // 一個本地服務就跑起來了,現在打開 http://localhost:3000 
  6. // 就可以看到一個大大的 hello world!  

Cookie 是怎樣工作的

在介紹 Cookie 是什么之前,我們來看看 Cookie 是如何工作的:

1. 首先,我們假設當前域名下還是沒有 Cookie 的

2. 接下來,瀏覽器發送了一個請求給服務器(這個請求是還沒帶上 Cookie 的)

3. 服務器設置 Cookie 并發送給瀏覽器(當然也可以不設置)

4. 瀏覽器將 Cookie 保存下來

5. 接下來,以后的每一次請求,都會帶上這些 Cookie,發送給服務器

驗證

我們來驗證一下。 

  1. // 修改 main.js 
  2.  
  3. app.get('/', (req, res) => { 
  4.   // 服務器接收到請求,在給響應設置一個 Cookie 
  5.   // 這個 Cookie 的 name 為 testName 
  6.   // value 為 testValue 
  7.   res.cookie('testName''testValue'
  8.   res.send('<h1>hello world!</h1>'
  9. }) 
  10.  
  11. // 保存之后,重啟服務器 
  12. // node main.js  

現在打開 http://localhost:3000

  1. 我們看到 Request Headers 并沒有 Cookie 這個字段
  2. 但是 Response Headers 有了 Set-Cookie 這個字段

現在我們刷新一下頁面,相當于重新向 http://localhost:3000/ 這個地址發起了一次請求。

現在我們就可以看到 Cookie 字段已經帶上了,再刷新幾次看 Cookie 也還是在的。

document.cookie

JS 提供了獲取 Cookie 的方法:document.cookie,我們先去設置多幾個 Cookie。

  1. app.get('/', (req, res) => { 
  2.   res.cookie('testName0''testValue0'
  3.   res.cookie('testName1''testValue1'
  4.   res.cookie('testName2''testValue2'
  5.   res.cookie('testName3''testValue3'
  6.   res.send('<h1>hello world!</h1>'
  7. })  

 

我們可以看到,Cookie 就是一段字符串。但這個字符串是有格式的,由鍵值對 key=value 構成,鍵值對之間由一個分號和一個空格隔開。

什么是 Cookie

說了這么多,大家應該知道 Cookie 是什么吧。整理一下有以下幾個點:

  • Cookie 就是瀏覽器儲存在用戶電腦上的一小段文本文件
  • Cookie 是純文本格式,不包含任何可執行的代碼
  • Cookie 由鍵值對構成,由分號和空格隔開
  • Cookie 雖然是存儲在瀏覽器,但是通常由服務器端進行設置
  • Cookie 的大小限制在 4kb 左右

Cookie 的屬性選項

每個 Cookie 都有一定的屬性,如什么時候失效,要發送到哪個域名,哪個路徑等等。在設置任一個 Cookie 時都可以設置相關的這些屬性,當然也可以不設置,這時會使用這些屬性的默認值。

expires / max-age

expires / max-age 都是控制 Cookie 失效時刻的選項。如果沒有設置這兩個選項,則默認有效期為 session,即會話 Cookie。這種 Cookie 在瀏覽器關閉后就沒有了。

expires

expires 選項用來設置 Cookie 什么時間內有效,expires 其實是 Cookie 失效日期。

expires 必須是 GMT 格式的時間(可以通過 new Date().toGMTString() 或者 new Date().toUTCString() 來獲得)

  1. app.get('/', (req, res) => { 
  2.   // 這個 Cookie 設置十秒后失效 
  3.   res.cookie('testName0''testValue0', { 
  4.     expires: new Date(Date.now() + 100000) 
  5.   }) 
  6.   // 這個 Cookie 不設置失效時間 
  7.   res.cookie('testName1''testValue1'
  8.   res.send('<h1>hello world!</h1>'
  9. })  

上面的代碼服務器設置了兩個 Cookie,一個設置了失效刻,另外一個沒有設置,也就是默認的失效時刻 session。現在我們重啟服務并且刷新一下頁面。

現在響應頭部已經加上了響應的設置失效時刻的字段了。在控制臺輸入下面的代碼。

  1. console.log(`現在的 cookie 是:${document.cookie}`) 
  2. setTimeout(() => { 
  3.   console.log(`5 秒后的 cookie 是:${document.cookie}`) 
  4. }, 5000) 
  5. setTimeout(() => { 
  6.   console.log(`10 秒后的 cookie 是:${document.cookie}`) 
  7. }, 10000)  

 

所以,Cookie 的失效時刻到了之后,通過 document.cookie 就訪問不到這個 Cookie 了,當然以后發送請求也不會再帶上這個失效的 Cookie 了。

max-age

expires 是 http/1.0 協議中的選項,在新的 http/1.1 協議中 expires 已經由 max-age 選項代替,兩者的作用都是限制 Cookie 的有效時間。expires 的值是一個時間點 (Cookie 失效時刻 = expires),而 max-age 的值是一個以秒為單位時間段 (Cookie 失效時刻 = 創建時刻 + max-age)

  1. // 設置 max-age,就是設置從 cookie 創建的時刻算起 
  2. // 再過多少秒 cookie 就會失效 
  3. app.get('/', (req, res) => { 
  4.   res.cookie('testName0''testValue0', { 
  5.     // express 這個參數是以毫秒來做單位的 
  6.     // 實際發送給瀏覽器就會轉換為秒 
  7.     // 十秒后失效 
  8.     maxAge: 10000 
  9.   }) 
  10.   res.cookie('testName1''testValue1'
  11.   res.send('<h1>hello world!</h1>'
  12. })  

優先級

如果同時設置了 max-age 和 expires,以 max-age 的時間為準。

  1. app.get('/', (req, res) => { 
  2.   res.cookie('name0''value0'
  3.   res.cookie('name1''value1', { 
  4.     expires: new Date(Date.now() + 30 * 1000), 
  5.     maxAge: 60 * 1000 
  6.   }) 
  7.   res.cookie('name2''value2', { 
  8.     maxAge: 60 * 1000 
  9.   }) 
  10.   res.send('<h1>hello world!</h1>'
  11. })  

 

domain 和 path

name、domain 和 path 可以標識一個唯一的 Cookie。domain 和 path 兩個選項共同決定了 Cookie 何時被瀏覽器自動添加到請求頭部中發送出去。具體是什么原理請看 Cookie 的作用域和作用路徑 這個章節。

如果沒有設置這兩個選項,則會使用默認值。domain 的默認值為設置該 Cookie 的網頁所在的域名,path 默認值為設置該 Cookie 的網頁所在的目錄。

secure

secure 選項用來設置 Cookie 只在確保安全的請求中才會發送。當請求是 HTTPS 或者其他安全協議時,包含 secure 選項的 Cookie 才能被保存到瀏覽器或者發送至服務器。

默認情況下,Cookie 不會帶 secure 選項(即為空)。所以默認情況下,不管是 HTTPS 協議還是 HTTP 協議的請求,Cookie 都會被發送至服務端。

httpOnly

這個選項用來設置 Cookie 是否能通過 js 去訪問。默認情況下,Cookie 不會帶 httpOnly 選項(即為空),客戶端是可以通過 js 代碼去訪問(包括讀取、修改、刪除等)這個 Cookie 的。當 Cookie 帶 httpOnly 選項時,客戶端則無法通過 js 代碼去訪問(包括讀取、修改、刪除等)這個 Cookie。

看看代碼吧,修改 main.js,保存重啟服務,刷新頁面。

  1. app.get('/', (req, res) => { 
  2.   res.cookie('notHttpOnly''testValue'
  3.   res.cookie('httpOnlyTest''testValue', { 
  4.     httpOnly: true 
  5.   }) 
  6.   res.send('<h1>hello world!</h1>'
  7. }) 

看圖,設置了 httpOnly 的 Cookie 多了一個勾。而且通過 document.cookie 無法訪問到那個 Cookie。

在客戶端是不能通過 js 代碼去設置 一個 httpOnly 類型的 Cookie 的,這種類型的 Cookie 只能通過服務端來設置,發送請求的時候,我們看到請求頭還是會帶上這個設置了 httpOnly 的 Cookie,如下圖。 

 

設置 Cookie

 

明確一點:Cookie 可以由服務端設置,也可以由客戶端設置。看到這里相信大家都可以理解了吧。

服務端設置 Cookie

看回剛剛的那張圖,我們設置了很多個 Cookie。 

一個 Set-Cookie 字段只能設置一個 Cookie,當你要想設置多個 Cookie,需要添加同樣多的 Set-Cookie 字段

服務端可以設置 Cookie 的所有選項:expires、domain、path、secure、HttpOnly

客戶端設置 Cookie

在網頁即客戶端中我們也可以通過 js 代碼來設置 Cookie。

設置

  1. document.cookie = 'name=value' 

可以設置 Cookie 的下列選項:expires、domain、path,各個鍵值對之間都要用 ; 和 空格 隔開

  1. document.cookie='name=value; expires=Thu, 26 Feb 2116 11:50:25 GMT; domain=sankuai.com; path=/'

secure

只有在 https 協議的網頁中,客戶端設置 secure 類型的 Cookie 才能成功

HttpOnly

客戶端中無法設置 HttpOnly 選項

刪除 Cookie

Cookie 的 name、path 和 domain 是唯一標識一個 Cookie 的。我們只要將一個 Cookie 的 max-age 設置為 0,就可以刪除一個 Cookie 了。

  1. let removeCookie = (name, path, domain) => { 
  2.   document.cookie = `${name}=; path=${path}; domain=${domain}; max-age=0` 
  3.  

Cookie 的作用域和作用路徑

作用域

在說這個作用域之前,我們先來對域名做一個簡單的了解。

子域,是相對父域來說的,指域名中的每一個段。各子域之間用小數點分隔開。放在域名***的子域稱為***級子域,或稱為一級域,在它前面的子域稱為二級域。

以下圖為例,news.163.com 和 sports.163.com 是子域,163.com 是父域。

當 Cookie 的 domain 為 news.163.com,那么訪問 news.163.com 的時候就會帶上 Cookie;

當 Cookie 的 domain 為 163.com,那么訪問 news.163.com 和 sports.163.com 就會帶上 Cookie

作用路徑

當 Cookie 的 domain 是相同的情況下,也有是否帶上 Cookie 也有一定的規則。

 

在子路徑內可以訪問訪問到父路徑的 Cookie,反過來就不行。

看看例子,還是先修改 main.js

  1. app.get('/parent', (req, res) => { 
  2.   res.cookie('parent-name''parent-value', { 
  3.     path: '/parent' 
  4.   }) 
  5.   res.send('<h1>父路徑!</h1>'
  6. }) 
  7.  
  8. app.get('/parent/childA', (req, res) => { 
  9.   res.cookie('child-name-A''child-value-A', { 
  10.     path: '/parent/childA' 
  11.   }) 
  12.   res.send('<h1>子路徑A!</h1>'
  13. }) 
  14.  
  15. app.get('/parent/childB', (req, res) => { 
  16.   res.cookie('child-name-B''child-value-B', { 
  17.     path: '/parent/childB' 
  18.   }) 
  19.   res.send('<h1>子路徑B!</h1>'
  20. })  

下面這里的 “域” 應該改為路徑 

 

 

 

 

 

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2024-04-22 00:00:00

幽靈依賴前端

2025-04-07 02:30:00

Cursor前端

2019-01-03 09:45:20

Go 前端 Web

2025-02-04 11:33:19

2015-10-23 11:15:32

前端性能優化

2022-11-21 18:02:04

前端測試

2017-02-24 14:18:50

前端HTTP緩存

2020-03-13 13:45:41

前端面試Web

2020-06-14 09:04:00

前端云計算無服務器

2024-07-02 09:03:48

2022-12-23 19:22:47

前端單測

2023-10-27 10:16:17

前端項目Rust

2021-04-15 08:08:48

微前端Web開發

2024-05-10 06:59:06

2024-07-07 22:28:34

2023-09-07 20:04:06

前后端趨勢Node.js

2015-10-12 16:37:39

前端編碼雙向編譯

2024-06-14 08:36:57

2017-09-01 18:27:36

前端 RxJs數據層

2022-07-08 11:18:33

前端實踐自動化
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一级免费黄色片 | 999久久久 | 亚洲 自拍 另类 欧美 丝袜 | 国产午夜精品一区二区三区在线观看 | 精品久久视频 | 天天狠狠| 国产激情视频在线免费观看 | 亚洲精品自在在线观看 | 青青久草 | 欧美一级高潮片免费的 | 99免费精品视频 | 久久爱黑人激情av摘花 | 亚洲小视频在线播放 | 国产精品不卡一区二区三区 | 一区二区三区精品在线 | 天天操夜夜爽 | 午夜av电影 | 91av在线影院 | 成人欧美一区二区三区在线观看 | 91玖玖 | 91激情电影 | 99在线免费视频 | 亚洲精品电影网在线观看 | 国产精品久久久乱弄 | 91视频一区二区三区 | 精品在线看| 午夜激情视频在线 | 欧美中文字幕一区 | 精品久久1 | 天天操伊人 | 狠狠艹 | 久久天堂 | 国产激情在线看 | 一区二区久久 | 华丽的挑战在线观看 | 国产在线二区 | 91色网站 | 国产精品视频在线播放 | 国产欧美日韩精品一区二区三区 | 97精品久久 | 久久精品亚洲 |