前端操作(cookie)


1、cookie

cookie是純文本,沒有可執行代碼,是指某些網站為了辨別用戶身份、進行 session 跟蹤而儲存在用戶本地終端(瀏覽器)上的數據(通常經過加密)。當用戶訪問了某個網站的時候,我們就可以通過cookie在訪問者電腦上存儲數據,或者某些網站為了辨別用戶身份、進行session 跟蹤而將數據儲存在用戶本地終端上(通常經過加密)。

cookie 默認是臨時存儲的,當瀏覽器關閉進程的時候自動銷毀。要想長時間保存一個cookie,就需要設置cookie的過期時間。當 Web 服務器創建了Cookies 后,只要在其有效期內,用戶訪問同一個 Web 服務器時,瀏覽器首先要檢查本地的Cookies,並將其原樣發送給 Web 服務器。cookie是能保持 Web 瀏覽狀態的手段。

2、cookie的工作過程

當網頁要發 http 請求時,瀏覽器會先檢查是否有相應的 cookie,有則自動添加在request header中的cookie字段中。這些是瀏覽器自動幫我們做的,而且每一次http請求瀏覽器都會自動幫我們做。

存儲在cookie中的數據,每次都會被瀏覽器自動放在http請求中。如果這些數據並不是每個請求都需要發給服務端的數據,瀏覽器這設置自動處理無疑增加了網絡開銷。但如果這些數據是每個請求都需要發給服務端的數據(比如身份認證信息),瀏覽器這設置自動處理就大大免去了重復添加操作。所以對於那種設置“每次請求都要攜帶的信息(最典型的就是身份認證信息)”就特別適合放在cookie中,其他類型的數據就不適合了。

工作過程:

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

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

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

(4)瀏覽器將 Cookie 保存下來

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

3、cookie的特征

(1)不同的瀏覽器存放的cookie位置不一樣,也是不能通用的。

(2)cookie的存儲是以域名形式進行區分的,在同一瀏覽器下不同的域名下存儲的cookie是獨立的。

(3)cookie也可以設置過期的時間,默認是會話結束的時候,當時間到期自動銷毀

(4)一個瀏覽器能創建的 Cookie 數量最多為 300 個,並且每個不能超過 4KB,每個 Web 站點能設置的 Cookie 總數不能超過 20 個

(5)我們可以設置cookie生效的域(當前設置cookie所在域的子域),也就是說,我們能夠操作的cookie是當前域以及當前域下的所有子域

(6)cookie 必須在 HTML 文件的內容輸出之前設置。如果用戶在瀏覽器上設置了禁止 Cookie,則 Cookie 不能建立。

4、cookie的設置

4.1、在客戶端設置

  1. document.cookie = '名字=值';
  2. document.cookie = 'username=cfangxu;domain=baike.baidu.com' //並且設置了生效域

注意: 客戶端可以設置cookie 的下列選項:expires、domain、path、secure(有條件:只有在https協議的網頁中,客戶端設置secure類型的 cookie 才能成功),但無法設置HttpOnly選項。

4.2、在服務器端設置

不管你是請求一個資源文件(如 html/js/css/圖片),還是發送一個ajax請求,服務端都會返回response。而response header中有一項叫set-cookie,是服務端專門用來設置cookie的。

  1. //Set-Cookie 消息頭是一個字符串,其格式如下(中括號中的部分是可選的):
  2. Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure]

注意: 一個set-Cookie字段只能設置一個cookie,當你要想設置多個 cookie,需要添加同樣多的set-Cookie字段。 
服務端可以設置cookie 的所有選項:expires、domain、path、secure、HttpOnly。通過 Set-Cookie 指定的這些可選項只會在瀏覽器端使用,而不會被發送至服務器端。

5、cookie的域概念(domain)

domain 指定了 cookie 將要被發送至哪個或哪些域中。默認情況下,domain 會被設置為創建該 cookie 的頁面所在的域名,所以當給相同域名發送請求時該 cookie 會被發送至服務器。瀏覽器會把 domain 的值與請求的域名做一個尾部比較(即從字符串的尾部開始比較),並將 domain 能匹配到域名的 cookie 發送至服務器。

(1)客戶端設置

  1. document.cookie = "username=cfangxu;path=/;domain=qq.com"

上面將 domain 設置為 qq.com,表示訪問域名尾部是 qq.com 的網站時瀏覽器都會將該 cookie 帶上。path 值為 "/" 表示訪問 qq.com 域名下的根目錄下的都將能帶上該 cookie

(2)服務端設置

  1. Set-Cookie: username=cfangxu;path=/;domain=qq.com
  2. // 注:一定的是同域之間的訪問,不能把domain的值設置成非主域的域名。

 6、cookie的路徑概念

因為安全方面的考慮,默認情況下,只有與創建 cookie 的頁面在同一個目錄或子目錄下的網頁才可以訪問。但 path 屬性可以為 cookie 指定路徑,domain 和 path 加起來構成了URL,表示當瀏覽器在訪問該 URL 下的網站或者 URL 帶有這個前綴的網站時都將會帶上該 cookie 。

(1)客戶端設置

 最常用的例子就是讓 cookie 在根目錄下,這樣不管是哪個子頁面創建的 cookie,該域名下的所有頁面都可以訪問到了。

  1. document.cookie = "username=cfangxu; path=/"

(2)服務器端設置

  1. Set-Cookie:name=cfangxu; path=/blog

如上設置:path 選項值會與 /blog,/blogrool 等等相匹配;任何以 /blog 開頭的選項都是合法的。需要注意的是,只有在 domain 選項核實完畢之后才會對 path 屬性進行比較。path 屬性的默認值是發送 Set-Cookie 消息頭所對應的 URL 中的 path 部分。

domain和path總結:

domain是域名,path是路徑,兩者加起來就構成了 URL,domain和path一起來限制 cookie 能被哪些 URL 訪問。 所以domain和path兩個選項共同決定了cookie何時被瀏覽器自動添加到請求頭部中發送出去。如果沒有設置這兩個選項,則會使用默認值。domain的默認值為設置該cookie的網頁所在的域名,path默認值為設置該cookie的網頁所在的目錄。

 7、JavaScript操作cookie

JavaScript 可以使用 document.cookie 屬性來創建 、讀取、及刪除 cookie。

7,1、創建cookie

  1. document.cookie="username=John Doe";

添加過期時間(以 UTC 或 GMT 時間)。默認情況下,cookie 在瀏覽器關閉時刪除

  1. document.cookie="username=John Doe; expires=Thu, 18 Dec 2043 12:00:00 GMT";

添加瀏覽器 cookie 的路徑。默認情況下,cookie 屬於當前頁面。

  1. document.cookie="username=John Doe; expires=Thu, 18 Dec 2043 12:00:00 GMT; path=/";

7.2、讀取cookie

 通過document.cookie來獲取當前網站下的cookie的時候,得到的是字符串形式的值,它包含了當前網站下所有的cookie,這個方法只能獲取非 HttpOnly 類型的cookie。它會把所有的cookie通過一個分號+空格的形式串聯起來,例如:username=chenfangxu; job=coding

  1. var x = document.cookie;

 7.3、修改 cookie

要想修改一個cookie,只需要重新賦值就行,舊的值會被新的值覆蓋。但要注意一點,在設置新cookie時,path/domain這幾個選項一定要舊cookie 保持一樣。否則不會修改舊值,而是添加了一個新的 cookie。

  1. document.cookie="username=John Smith; expires=Thu, 18 Dec 2043 12:00:00 GMT; path=/";

7.4、刪除 cookie

把要刪除的cookie的過期時間設置成已過去的時間,path/domain/這幾個選項一定要舊cookie 保持一樣。

  1. document.cookie = "username=; expires=Thu, 01 Jan 1970 00:00:00 GMT";

 

     轉載https://www.cnblogs.com/wenxuehai/p/10470716.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM