您好,登錄后才能下訂單哦!
本篇內容主要講解“Cookie的讀寫操作怎么實現”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Cookie的讀寫操作怎么實現”吧!
一、Cookie的出現
瀏覽器和服務器之間的通信少不了HTTP協議,但是因為HTTP協議是無狀態的,所以服務器并不知道上一次瀏覽器做了什么樣的操作,這樣嚴重阻礙了交互式Web 應用程序的實現。
針對上述的問題,網景公司的程序員創造了Cookie。
二、Cookie的傳輸
服務器端在實現Cookie標準的過程中,需要對任意HTTP請求發送Set-Cookie HTTP頭作為響應的一部分:
1. Set-Cookie: name=value; expires=Tue, 03-Sep-2019 14:10:21 GMT; path=/; domain=.xxx.com;
瀏覽器端會存儲這樣的Cookie,并且為之后的每個請求添加Cookie HTTP請求頭發送回服務器:
1. Cookie: name=value
服務器通過驗證Cookie值,來判斷瀏覽器發送請求屬于哪一個用戶。
三、瀏覽器中的Cookie
瀏覽器中的Cookie主要由以下幾部分組成:
· 名稱:Cookie唯一的名稱,必須經過URL編碼處理。(同名會出現覆蓋的情況)
· 值:必須經過URL編碼處理。
· 域(domain):默認情況下cookie在當前域下有效,你也可以設置該值來確保對其子域是否有效。
· 路徑(path):指定Cookie在哪些路徑下有效,默認是當前路徑下。
· 失效時間(expires):默認情況下,瀏覽器會話結束時會自動刪除Cookie;也可以設置一個GMT格式的日期,指定具體的刪除日期;如果設置的日期為以前的日期,那么Cookie會立即刪除。
· 安全標志(secure):指定之后只允許Cookie發送給https協議。
瀏覽器在發送請求時,只會將名稱與值添加到請求頭的Cookie字段中,發送給服務端。
瀏覽器提供了一個非常蹩腳的API來操作Cookie:
1. document.cookie
通過上述方法可以對該Cookie進行寫操作,每一次只能寫入一條Cookie字符串:
1. document.cookie = 'a=1; secure; path=/'
通過該方法還可以進行Cookie的讀操作:
1. document.cookie // "a=1"
由于上述方法操作Cookie非常的不直觀,一般都會寫一些函數來簡化Cookie讀取、設置和刪除操作。
對于Cookie的設置操作中,需要以下幾點:
對于名稱和值進行URL編碼處理,也就是采用JavaScript中的encodeURIComponent()方法; expires要求傳入GMT格式的日期,需要處理為更易書寫的方式,比如:設置秒數的方式; 注意只有的屬性名的secure;
每一段信息需要采用分號加空格。
1. function setCookie (key, value, attributes) {
2. if (typeof document === 'undefined') {
3. return
4. }
5. attributes = Object.assign({}, {
6. path: '/'
7. }, attributes)
8.
9. let { domain, path, expires, secure } = attributes
10.
11. if (typeof expires === 'number') {
12. expires = new Date(Date.now() + expires * 1000)
13. }
14. if (expires instanceof Date) {
15. expires = expires.toUTCString()
16. } else {
17. expires = ''
18. }
19.
20. key = encodeURIComponent(key)
21. value = encodeURIComponent(value)
22.
23. let cookieStr = `${key}=${value}`
24.
25. if (domain) {
26. cookieStr += `; domain=${domain}`
27. }
28.
29. if (path) {
30. cookieStr += `; path=${path}`
31. }
32.
33. if (expires) {
34. cookieStr += `; expires=${expires}`
35. }
36.
37. if (secure) {
38. cookieStr += `; secure`
39. }
40.
41. return (document.cookie = cookieStr)
42.}
Cookie的讀操作需要注意的是將名稱與值進行URL解碼處理,也就是調用JavaScript中的decodeURIComponent()方法:
1. function getCookie (name) {
2. if (typeof document === 'undefined') {
3. return
4. }
5. let cookies = []
6. let jar = {}
7. document.cookie && (cookies = document.cookie.split('; '))
8.
9. for (let i = 0, max = cookies.length; i < max; i++) {
10. let [key, value] = cookies[i].split('=')
11. key = decodeURIComponent(key)
12. value = decodeURIComponent(value)
13. jar[key] = value
14. if (key === name) {
15. break
16. }
17. }
18.
19. return name ? jar[name] : jar
20.}
最后一個清除的方法就更加簡單了,只要將失效日期(expires)設置為過去的日期即可:
1. function removeCookie (key) {
2. setCookie(key, '', { expires: -1 })
3. }
介紹Cookie基本操作的封裝之后,還需要了解瀏覽器為了限制Cookie不會被惡意使用,規定了Cookie所占磁盤空間的大小以及每個域名下Cookie的個數。
四、服務端的Cookie
相比較瀏覽器端,服務端執行Cookie的寫操作時,是將拼接好的Cookie字符串放入響應頭的Set-Cookie字段中;執行Cookie的讀操作時,則是解析HTTP請求頭字段Cookie中的鍵值對。
與瀏覽器最大的不同,在于服務端對于Cookie的安全性操碎了心
signed
當設置signed=true時,服務端會對該條Cookie字符串生成兩個Set-Cookie響應頭字段:
1. Set-Cookie: lastTime=2019-03-05T14:31:05.543Z; path=/; httponly
2. Set-Cookie: lastTime.sig=URXREOYTtMnGm0b7qCYFJ2Db400; path=/; httponly
這里通過再發送一條以.sig為后綴的名稱以及對值進行加密的Cookie,來驗證該條Cookie是否在傳輸的過程中被篡改。
httpOnly
服務端Set-Cookie字段中新增httpOnly屬性,當服務端在返回的Cookie信息中含有httpOnly字段時,開發者是不能通過JavaScript來操縱該條Cookie字符串的。
這樣做的好處主要在于面對XSS(Cross-site scripting)攻擊時,黑客無法拿到設置httpOnly字段的Cookie信息。
此時,你會發現localStorage相比較Cookie,在XSS攻擊的防御上就略遜一籌了。 sameSite
在介紹這個新屬性之前,首先你需要明白:當用戶從http://a.com發起http://b.com的請求也會攜帶上Cookie,而從http://a.com攜帶過來的Cookie稱為第三方Cookie。
雖然第三方Cookie有一些好處,但是給CSRF(Cross-site request forgrey)攻擊的機會。
為了從根源上解決CSRF攻擊,sameSite屬性便閃亮登場了,它的取值有以下幾種:
· strict:瀏覽器在任何跨域請求中都不會攜帶Cookie,這樣可以有效的防御CSRF攻擊,但是對于有多個子域名的網站采用主域名存儲用戶登錄信息的場景,每個子域名都需要用戶重新登錄,造成用戶體驗非常的差。
· lax:相比較strict,它允許從三方網站跳轉過來的時候使用Cookie。
為了方便大家理解sameSite的實際效果,可以看這個例子:
1. // a.com 服務端會在訪問頁面時返回如下Cookie
2. cookies.set('foo', 'aaaaa')
3. cookies.set('bar', 'bbbbb')
4. cookies.set('name', 'cccccc')
5.
6. // b.com 服務端會在訪問頁面時返回如下Cookie
7. cookies.set('foo', 'a', { sameSite: 'strict' })
8. cookies.set('bar', 'b', { sameSite: 'lax' })
9. cookies.set('baz', 'c')
如何現在用戶在a.com中點擊鏈接跳轉到b.com,它的請求頭是這樣的:
1. Request Headers
2.
3. Cookie: bar=b; baz=c
五、網站性能優化
Cookie在服務端和瀏覽器的通信中,主要依靠HTTP的響應頭和請求頭傳輸的,所以Cookie會占據一定的帶寬。
前面提到瀏覽器會為每一次HTPP請求自動攜帶上Cookie信息,但是對于同站內的靜態資源,服務器并不需要處理其攜帶的Cookie,這無形中便浪費了帶寬。
在最佳實踐中,一般都會將靜態資源部署到獨立的域名上,從而可以避免無效Cookie的影響。
到此,相信大家對“Cookie的讀寫操作怎么實現”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。