摘要:協議當初為了讓協議盡量簡潔,制定為無狀態協議,即指每次請求之前是相互獨立的,當前請求并不會記錄它的上一次請求信息。其實是失效日期,必須是格式的時間可以通過或者來獲得。根據規范,瀏覽器訪問只會攜帶的,而不會攜帶的。
HTTP協議當初為了讓協議盡量簡潔,制定為無狀態協議,即指每次request請求之前是相互獨立的,當前請求并不會記錄它的上一次請求信息。那么問題來了,開發中經常需要用到狀態記錄,比如日常的登錄網站,不可能每次登錄都要客戶重新輸入密碼,這樣用戶體驗肯定會很差,那如何讓無狀態的http協議將狀態記錄下來呢?
于是瀏覽器廠商發明了cookie來解決這個難題。
Cookie總是保存在客戶端中,按在客戶端中的存儲位置,可分為內存Cookie和硬盤Cookie,設置了過期時間Expires(Cookie的幾個屬性之一)的Cookie會存儲在硬盤里面,不同操作系統cookie的儲存路徑會有所不同,而沒有設置該屬性的Cookie會存儲在內存里面,此時瀏覽器的選項卡可以共享同一個cookie信息,關閉瀏覽器就會清除該Cookie!
首先看一下cookie在前后端交互中的應用:
第一次驗證成功后,服務端會在響應頭信息中帶上“set-cookie”字段,瀏覽器監測到該字段之后,會把其中的值對號入座寫入瀏覽器的cookie的屬性中
存儲在cookie中的數據,在它過期之前,每次都會被瀏覽器自動放在http請求中,如果這些數據并不是每個請求都需要發給服務端的數據,瀏覽器這設置自動處理無疑增加了網絡開銷;但如果這些數據是每個請求都需要發給服務端的數據(比如身份認證信息),瀏覽器這設置自動處理就大大免去了重復添加操作。所以對于那設置“每次請求都要攜帶的信息(最典型的就是身份認證信息token)”就特別適合放在cookie中。而服務器端通過驗證cookie中的信息,實現了驗證,也讓瀏覽器端省去了每次都需要輸入登錄信息的麻煩。
為了實現cookie的作用,除了name和value之外,設計者還給它增加了七個屬性,分別是expires/max-age、domain、path、secure、HttpOnly、samesite,這些屬性是通過cookie選項來設置的,在設置任一個cookie時都可以設置相關的這些屬性,當然也可以不設置,這時會使用這些屬性的默認值。
Expires和Max-Age
expires選項用來設置“cookie 什么時間內有效”。expires其實是cookie失效日期,expires必須是?GMT?格式的時間(可以通過new Date().toGMTString()或者?new Date().toUTCString()?來獲得)。
如expires=Thu, 25 Feb 2016 04:18:00 GMT表示cookie講在2016年2月25日4:18分之后失效,對于失效的cookie瀏覽器會清空。如果沒有設置該選項,則默認有效期為session,即會話cookie。這種cookie在瀏覽器關閉后就沒有了,屬于內存cookie。而max-age就是cookie寫入之后的有效時長,比如max-age=600就是600秒后,cookie則會失效。max-age的優先級高于expires
domain 和 path
domain是域名,path是路徑,兩者加起來就構成了 URL,domain和path一起來限制 cookie 能被哪些 URL 訪問,domain屬性的默認值是創建cookie的網頁所在服務器的主機名。不能將一個cookie的域設置成服務器所在的域之外的域,要想cookie在多個二級域名中共享,需要設置domain為頂級域名。
HttpOnly
告知瀏覽器不允許通過腳本document.cookie去更改這個值,同樣這個值在document.cookie中也不可見。但在http請求張仍然會攜帶這個cookie。注意這個值雖然在腳本中不可獲取,但仍然在瀏覽器安裝目錄中以文件形式存在。
secure
安全標志,指定后,只有在使用SSL鏈接(https)時候才能發送到服務器,如果是http鏈接則不會傳遞該信息。就算設置了secure 屬性也并不代表他人不能看到你機器本地保存的 cookie 信息,所以不要把重要信息放在cookie中。
samesite
主要為了防御CSRF攻擊(跨站點請求偽造)而添加的cookie屬性,SameSite=Strict嚴格模式,表明這個 cookie 在任何情況下都不可能作為第三方 cookie,有興趣了解可以查下“csrf攻擊”的資料
除了服務器端返回的set-cookie字段,瀏覽器端也可以對cookie進行操作,有npm為我們封裝好的插件js-cookie: https://www.npmjs.com/package...,不過我們還是用原生方法手動實現一遍
獲取cookie:
在控制臺輸入document.cookie,或者js代碼中console.log(document.cookie)可以得到下圖:
可以看到,cookie是一個個鍵值對(“鍵=值”的形式)加上分號空格隔開組合而成, 形如: "name1=value1; name2=value2; name3=value3",可以用正則表達式來提取等號后面的值
function getCookie(name) { var value = "; "+ document.cookie; var parts = value.split("; " + name + "="); if(parts.length === 2) { return parts.pop().split(";").shift(); } }
寫入cookie
function setCookie (name, value, day) { if(day !== 0){ //當設置的時間等于0時,不設置expires屬性,cookie在瀏覽器關閉后刪除 var expires = day * 24 * 60 * 60 * 1000 var date = new Date(+new Date()+expires); document.cookie = name + "=" + escape(value) + ";expires=" + date.toUTCString() }else{ document.cookie = name + "=" + escape(value) } }
注意:expires使用GMT或UTC格式的時間, 我這里沒有指定路徑(path)和域(domain), 當沒有指定路徑時默認為當前路徑下,如對 于“https://home.cnblogs.com/u/ma...”下設置的cookie,其path為"/u/maderlzp", 其domain為當前域名“home.cnblogs.com”
刪除cookie
設置cookie過期時間小于當前時間,那么就會刪除該cookie
function deleteCookie(name) { document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:01 GMT;" }
Cookie具有不可跨域名性。根據Cookie規范,瀏覽器訪問Google.com只會攜帶Google.com的Cookie,而不會攜帶Baidu.com的Cookie。Google.com也只能操作Google.com的Cookie,而不能操作Baidu.com的Cookie
<完>
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/110285.html
摘要:協議當初為了讓協議盡量簡潔,制定為無狀態協議,即指每次請求之前是相互獨立的,當前請求并不會記錄它的上一次請求信息。其實是失效日期,必須是格式的時間可以通過或者來獲得。根據規范,瀏覽器訪問只會攜帶的,而不會攜帶的。 HTTP協議當初為了讓協議盡量簡潔,制定為無狀態協議,即指每次request請求之前是相互獨立的,當前請求并不會記錄它的上一次請求信息。那么問題來了,開發中經常需要用到狀態記...
摘要:響應組成狀態消息報頭響應正。狀態組成服務器協議的版本,服務器發回的響應狀態代碼和狀態代碼的本描述。向指定的資源發出顯示請求。向指定資源提交數據,請求服務器進行處理例如提交表單或者上傳文件。回顯服務器收到的請求,主要用于測試或診斷。 引言 這篇文章是我各處收集有關于http的知識,不成體系,愛看不看?,看完點贊。 我們輸入網址之后發生的事情 輸入網址并回車(URL 包括 協議名稱 域名...
摘要:那么,怎么才能讓服務器識別瀏覽器身份,認為是同一用戶的多次請求,從而達到數據共享呢這就要用到會話技術了,本質上就是數據持久化存儲。 由來 瀏覽器和服務器間的數據交互,就是會話。 但是呢,http協議是無狀態無記憶的,就會導致業務的不連續性。 [不連續性的說明]譬如你在xxx網站A界面登錄成功,當你點擊跳轉到B界面時,又會提示請登錄。 ...
閱讀 2805·2023-04-26 01:00
閱讀 745·2021-10-11 10:59
閱讀 2973·2019-08-30 11:18
閱讀 2666·2019-08-29 11:18
閱讀 1017·2019-08-28 18:28
閱讀 3009·2019-08-26 18:36
閱讀 2130·2019-08-23 18:16
閱讀 1064·2019-08-23 15:56