摘要:例如用戶去去買點(diǎn)東西,添加了一個(gè)熱水壺一部小米手機(jī)到購(gòu)物車?yán)锩?,那么服?wù)器端可以改寫(xiě)你上面的使之具體化,表示你購(gòu)物車?yán)锩尜I了倆東西。一張圖總結(jié)注冊(cè)登錄的過(guò)程接下來(lái)可以去搞一搞其他的,像什么哇代碼鏈接
上篇介紹了注冊(cè)的基本流程,下篇簡(jiǎn)單的講講登錄的流程以及Cookie的出現(xiàn)實(shí)現(xiàn)登錄的小功能
當(dāng)你在瀏覽器的輸入框里輸入localhost:8080/sign_in的時(shí)候,會(huì)發(fā)起GET請(qǐng)求,去訪問(wèn)sign_in.html
if (path === "/sign_up" && method === "GET") { let string = fs.readFileSync("./sign_up.html", "utf8") response.statusCode = 200 response.setHeader("Content-Type", "text/html;charset=utf-8") response.write(string) response.end() }
CSS布局與上篇的布局基本一樣,略去不表~
比對(duì)用戶的信息與數(shù)據(jù)庫(kù)里面的信息是否匹配依然是上篇的套路,獲得用戶formdata后,分析數(shù)據(jù),和數(shù)據(jù)庫(kù)里面的比對(duì)
var users = fs.readFileSync("./db/users", "utf8") try { users = JSON.parse(users) //[] JSON也支持?jǐn)?shù)組 } catch (exception) { users = [] } let found for (let i = 0; i < users.length; i++) { if (users[i].email === email && users[i].password === password) { found = true break } } if (found) { response.setHeader("Set-Cookie", `sign_in_email=${email};HTTPOnly`) response.statusCode = 200 } else { response.statusCode = 401 }
不同的是引入了一個(gè)header,也就是今天的主角--Cookie
其實(shí)這和平常上網(wǎng)的情形類似的,有時(shí)候我們?cè)L問(wèn)一些購(gòu)物網(wǎng)站,并沒(méi)有登錄,但是你在購(gòu)物車?yán)锩嫣砑訓(xùn)|西了,當(dāng)你逛了以后再回來(lái)的時(shí)候,發(fā)現(xiàn)購(gòu)物車?yán)锩嬗心愕挠涗洠瑤湍阕鲞@個(gè)事的也是cookie。
因?yàn)镠TTP協(xié)議是無(wú)狀態(tài)的,即服務(wù)器不知道用戶上一次做了什么,這嚴(yán)重阻礙了交互式Web應(yīng)用程序的實(shí)現(xiàn)。在典型的網(wǎng)上購(gòu)物場(chǎng)景中,用戶瀏覽了幾個(gè)頁(yè)面,買了一盒餅干和兩瓶飲料。最后結(jié)帳時(shí),由于HTTP的無(wú)狀態(tài)性,不通過(guò)額外的手段,服務(wù)器并不知道用戶到底買了什么,所以Cookie就是用來(lái)繞開(kāi)HTTP的無(wú)狀態(tài)性的“額外手段”之一。服務(wù)器可以設(shè)置或讀取Cookies中包含信息,借此維護(hù)用戶跟服務(wù)器會(huì)話)中的狀態(tài)。
可以看出,當(dāng)你在sign_in發(fā)起GET請(qǐng)求并設(shè)置了Set-Cookie之后,其他的同源的頁(yè)面,又都會(huì)帶上Cookie,也就能保證同源的網(wǎng)頁(yè)向服務(wù)器發(fā)起請(qǐng)求的時(shí)候,服務(wù)器能夠明白,你己經(jīng)是登錄的用戶了,與那些沒(méi)有拿到cookie的頁(yè)面區(qū)別開(kāi)來(lái)。
Cookie的入門(mén)為什么要在cookie里面寫(xiě)上HttpOnly呢,因?yàn)檫@個(gè)可以防止有些牛人使用JS修改Cookie的內(nèi)容。
如果不寫(xiě)這個(gè)的話,可以使用js修改的
寫(xiě)了HttpOnly之后將無(wú)法修改
_ga是啥這個(gè)是Chrome的功能,用于分析cookie的
每一部分的作用詳見(jiàn)這里
Cookie的特點(diǎn)通過(guò)上述的例子,可以總結(jié)幾點(diǎn)重要的特點(diǎn)
服務(wù)器通過(guò) Set-Cookie 響應(yīng)頭設(shè)置 Cookie
瀏覽器得到 Cookie 之后,每次請(qǐng)求都要帶上 Cookie
服務(wù)器讀取 Cookie 就知道登錄用戶的信息(email)
當(dāng)然了,還有幾個(gè)問(wèn)題需要解答一下。
Cookie 存在哪
存在硬盤(pán)的一個(gè)文件里面
Cookie會(huì)被用戶篡改嗎?
可以,也就是說(shuō)它并不安全的。
Cookie 有效期嗎?
默認(rèn)有效期20分鐘左右,不同瀏覽器策略不同
后端可以強(qiáng)制設(shè)置有效期
Set-Cookie:= ; Expires= Set-Cookie: = ; Max-Age=
具體語(yǔ)法看 Set-Cookie
用戶登錄后,首頁(yè)顯示不同既然你成功登錄,理應(yīng)跳轉(zhuǎn)到首頁(yè),并顯示相應(yīng)的界面。
$.post("/sign_in", hash) .then((response) => { window.location.href = "/" }, (request) => { alert("郵箱與密碼不匹配") } )
然后首頁(yè)的信息應(yīng)該根據(jù)用戶信息做出相應(yīng)的變化
let cookies = request.headers.cookie.split("; ") //["email=..@..", "a=1"] let hash = {} cookies.forEach((cookie) => { let parts = cookie.split("=") let key = parts[0] let value = parts[1] hash[key] = value }) let email = hash.sign_in_email let users = fs.readFileSync("./db/users", "utf8") users = JSON.parse(users) let foundUser for (let i = 0; i < users.length; i++) { if (users[i].email === email) { foundUser = users[i] break } } if (foundUser) { string = string.replace("email", foundUser.email) } else { string = string.replace("恭喜,email你已成功登錄", "沒(méi)有該用戶") }
這里的代碼邏輯與上篇的基本一致,唯一的不同在于第一行代碼
let cookies = request.headers.cookie.split("; ") //["email=..@..", "a=1"]
為什么用; 字符來(lái)分割呢,這是因?yàn)榭梢杂卸鄠€(gè)cookie
Cookie的兩個(gè)作用一般來(lái)說(shuō)常見(jiàn)的作用有如下兩個(gè):
識(shí)別用戶的身份。當(dāng)用戶A去訪問(wèn)localhost:8080的時(shí)候,服務(wù)器會(huì)給A一個(gè)獨(dú)一無(wú)二的id=00A(這就是cookie),當(dāng)用戶A訪問(wèn)localhost:8080的其他網(wǎng)頁(yè)的時(shí)候,都會(huì)帶著那個(gè)獨(dú)一無(wú)二的id。當(dāng)B用戶來(lái)訪問(wèn)localhost:8080的時(shí)候,服務(wù)器發(fā)現(xiàn)他沒(méi)有任何標(biāo)識(shí),也會(huì)給他一個(gè)獨(dú)一無(wú)二的id=00B,所以借助cookie服務(wù)器端就能夠分清楚誰(shuí)是誰(shuí)了。
記錄你的瀏覽歷史。最常見(jiàn)的需求就是你去逛購(gòu)物網(wǎng)站,你添加到購(gòu)物車?yán)锩娴臇|西過(guò)幾天一定會(huì)在,而不會(huì)憑空消失了。例如A用戶去taobao.com去買點(diǎn)東西,添加了一個(gè)熱水壺、一部小米手機(jī)到購(gòu)物車?yán)锩妫敲捶?wù)器端可以改寫(xiě)你上面的cookie使之具體化「id=00A; cart=A1,A2」,表示你購(gòu)物車?yán)锩尜I了倆東西。你過(guò)幾天想起來(lái)了,去購(gòu)物車?yán)锩婵?,熱水壺、小米手機(jī)還在里面。瀏覽器并不會(huì)刪除你存到硬盤(pán)上的cookie。
一張圖總結(jié)注冊(cè)登錄的過(guò)程接下來(lái)可以去搞一搞其他的,像什么session LocalStorage……(@ο@) 哇~
代碼鏈接sign_in.html
server.js
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/51833.html
摘要:例如用戶去去買點(diǎn)東西,添加了一個(gè)熱水壺一部小米手機(jī)到購(gòu)物車?yán)锩?,那么服?wù)器端可以改寫(xiě)你上面的使之具體化,表示你購(gòu)物車?yán)锩尜I了倆東西。一張圖總結(jié)注冊(cè)登錄的過(guò)程接下來(lái)可以去搞一搞其他的,像什么哇代碼鏈接 上篇介紹了注冊(cè)的基本流程,下篇簡(jiǎn)單的講講登錄的流程以及Cookie的出現(xiàn) 實(shí)現(xiàn)登錄的小功能 當(dāng)你在瀏覽器的輸入框里輸入localhost:8080/sign_in的時(shí)候,會(huì)發(fā)起GET請(qǐng)求,...
摘要:如果非要用漢語(yǔ)理解的話應(yīng)該是一段小型文本文件,由網(wǎng)景的創(chuàng)始人之一的盧蒙特利在年發(fā)明。上述的套路會(huì)一直用下去,的組合。應(yīng)該填入信息后,錯(cuò)誤信息就消失的。 cookie 如果非要用漢語(yǔ)理解的話應(yīng)該是 一段小型文本文件,由網(wǎng)景的創(chuàng)始人之一的盧 蒙特利在93年發(fā)明。上篇是熟悉一下注冊(cè)的大致流程,下篇熟悉登錄流程以及真正的Cookie 實(shí)現(xiàn)基本的注冊(cè)功能 我們打開(kāi)網(wǎng)站,瀏覽網(wǎng)站,最常見(jiàn)的兩個(gè)操...
摘要:服務(wù)器給客戶端們頒發(fā)一個(gè)通行證,無(wú)論誰(shuí)訪問(wèn)都必須攜帶自己通行證,這樣服務(wù)器就能從通行證上確認(rèn)客戶身份了。瀏覽器根據(jù)是否設(shè)置的過(guò)期時(shí)間判斷該是會(huì)話還是永久,并將存儲(chǔ)在不同的位置。 服務(wù)端存放在客戶端的一段數(shù)據(jù)。這段數(shù)據(jù)在客戶端每次進(jìn)行http請(qǐng)求時(shí)會(huì)自動(dòng)加在http請(qǐng)求報(bào)文中的header上;服務(wù)端在響應(yīng)時(shí),可以對(duì)cookie進(jìn)行設(shè)置,并將cookie加入到http響應(yīng)報(bào)文header中...
閱讀 3064·2023-04-26 02:27
閱讀 2776·2021-11-22 13:54
閱讀 916·2021-11-12 10:36
閱讀 3772·2021-10-09 09:44
閱讀 3188·2021-10-09 09:41
閱讀 1239·2021-09-22 10:02
閱讀 2848·2019-08-30 15:56
閱讀 3115·2019-08-30 11:02