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