一块小饼干(Cookie)的故事-下篇
上篇介紹了注冊的基本流程,下篇簡單的講講登錄的流程以及Cookie的出現(xiàn)
實現(xiàn)登錄的小功能
當(dāng)你在瀏覽器的輸入框里輸入localhost:8080/sign_in的時候,會發(fā)起GET請求,去訪問sign_in.html
if (path === '/sign_up' && method === 'GET') {let string = fs.readFileSync('./sign_up.html', 'utf8')response.statusCode = 200response.setHeader('Content-Type', 'text/html;charset=utf-8')response.write(string)response.end() } 復(fù)制代碼CSS布局與上篇的布局基本一樣,略去不表~
比對用戶的信息與數(shù)據(jù)庫里面的信息是否匹配
依然是上篇的套路,獲得用戶formdata后,分析數(shù)據(jù),和數(shù)據(jù)庫里面的比對
var users = fs.readFileSync('./db/users', 'utf8') try {users = JSON.parse(users) //[] JSON也支持數(shù)組 } catch (exception) {users = [] }let found for (let i = 0; i < users.length; i++) { if (users[i].email === email && users[i].password === password) {found = truebreak} } if (found) {response.setHeader('Set-Cookie', `sign_in_email=${email};HTTPOnly`)response.statusCode = 200 } else {response.statusCode = 401 } 復(fù)制代碼不同的是引入了一個header,也就是今天的主角--Cookie
其實這和平常上網(wǎng)的情形類似的,有時候我們訪問一些購物網(wǎng)站,并沒有登錄,但是你在購物車里面添加?xùn)|西了,當(dāng)你逛了以后再回來的時候,發(fā)現(xiàn)購物車里面有你的記錄,幫你做這個事的也是cookie。
因為HTTP協(xié)議是無狀態(tài)的,即服務(wù)器不知道用戶上一次做了什么,這嚴重阻礙了交互式Web應(yīng)用程序的實現(xiàn)。在典型的網(wǎng)上購物場景中,用戶瀏覽了幾個頁面,買了一盒餅干和兩瓶飲料。最后結(jié)帳時,由于HTTP的無狀態(tài)性,不通過額外的手段,服務(wù)器并不知道用戶到底買了什么,所以Cookie就是用來繞開HTTP的無狀態(tài)性的“額外手段”之一。服務(wù)器可以設(shè)置或讀取Cookies中包含信息,借此維護用戶跟服務(wù)器會話中的狀態(tài)。
可以看出,當(dāng)你在sign_in發(fā)起GET請求并設(shè)置了Set-Cookie之后,其他的同源的頁面,又都會帶上Cookie,也就能保證同源的網(wǎng)頁向服務(wù)器發(fā)起請求的時候,服務(wù)器能夠明白,你己經(jīng)是登錄的用戶了,與那些沒有拿到cookie的頁面區(qū)別開來。
Cookie的入門
為什么要在cookie里面寫上HttpOnly呢,因為這個可以防止有些牛人使用JS修改Cookie的內(nèi)容。
- 如果不寫這個的話,可以使用js修改的
寫了HttpOnly之后將無法修改
_ga是啥
這個是Chrome的功能,用于分析cookie的
每一部分的作用詳見這里
Cookie的特點
通過上述的例子,可以總結(jié)幾點重要的特點
當(dāng)然了,還有幾個問題需要解答一下。
默認有效期20分鐘左右,不同瀏覽器策略不同 后端可以強制設(shè)置有效期
Set-Cookie: <cookie-name>=<cookie-value>; Expires=<date> Set-Cookie: <cookie-name>=<cookie-value>; Max-Age=<non-zero-digit> 復(fù)制代碼具體語法看 Set-Cookie
用戶登錄后,首頁顯示不同
既然你成功登錄,理應(yīng)跳轉(zhuǎn)到首頁,并顯示相應(yīng)的界面。
$.post('/sign_in', hash) .then((response) => {window.location.href = '/' }, (request) => {alert('郵箱與密碼不匹配')} ) 復(fù)制代碼然后首頁的信息應(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你已成功登錄', '沒有該用戶') } 復(fù)制代碼這里的代碼邏輯與上篇的基本一致,唯一的不同在于第一行代碼
let cookies = request.headers.cookie.split('; ') //['email=..@..', 'a=1']
為什么用;字符來分割呢,這是因為可以有多個cookie
Cookie的兩個作用
一般來說常見的作用有如下兩個:
一張圖總結(jié)注冊登錄的過程
接下來可以去搞一搞其他的,像什么session LocalStorage……(@ο@) 哇~
代碼鏈接sign_in.html
server.js
總結(jié)
以上是生活随笔為你收集整理的一块小饼干(Cookie)的故事-下篇的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【368天】跃迁之路——程序员高效学习方
- 下一篇: 正则表达式-获取