上篇介紹了註冊的基本流程,下篇簡單的講講登陸的流程以及Cookie的出現
當你在瀏覽器的輸入框裏輸入localhost:8080/sign_in
的時候,會發起GET
請求,去訪問sign_in.html
javascript
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佈局與上篇的佈局基本同樣,略去不表~php
依然是上篇的套路,得到用戶formdata後,分析數據,和數據庫裏面的比對html
var users = fs.readFileSync('./db/users', 'utf8') try { users = JSON.parse(users) //[] JSON也支持數組 } 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 }
不一樣的是引入了一個header
,也就是今天的主角--Cookiejava
其實這和日常上網的情形相似的,有時候咱們訪問一些購物網站,並無登陸,可是你在購物車裏面添加東西了,當你逛了之後再回來的時候,發現購物車裏面有你的記錄,幫你作這個事的也是cookie。node
由於 HTTP協議是無狀態的,即 服務器不知道用戶上一次作了什麼,這嚴重阻礙了 交互式Web應用程序的實現。在典型的網上購物場景中,用戶瀏覽了幾個頁面,買了一盒餅乾和兩瓶飲料。最後結賬時,因爲HTTP的無狀態性,不經過額外的手段,服務器並不知道用戶到底買了什麼,因此Cookie就是用來繞開HTTP的無狀態性的「額外手段」之一。服務器能夠設置或讀取Cookies中包含信息,藉此維護用戶跟服務器 會話)中的狀態。
能夠看出,當你在sign_in發起GET
請求並設置了Set-Cookie
以後,其餘的同源的頁面,又都會帶上Cookie
,也就能保證同源的網頁向服務器發起請求的時候,服務器可以明白,你己經是登陸的用戶了,與那些沒有拿到cookie的頁面區別開來。git
爲何要在cookie裏面寫上HttpOnly
呢,由於這個能夠防止有些牛人使用JS
修改Cookie的內容。github
js
修改的
寫了HttpOnly
以後將沒法修改數據庫
這個是Chrome的功能,用於分析cookie的後端
每一部分的做用詳見這裏數組
經過上述的例子,能夠總結幾點重要的特色
固然了,還有幾個問題須要解答一下。
默認有效期20分鐘左右,不一樣瀏覽器策略不一樣
後端能夠強制設置有效期
Set-Cookie: <cookie-name>=<cookie-value>; Expires=<date> Set-Cookie: <cookie-name>=<cookie-value>; Max-Age=<non-zero-digit>
具體語法看 Set-Cookie
既然你成功登陸,理應跳轉到首頁,並顯示相應的界面。
$.post('/sign_in', hash) .then((response) => { window.location.href = '/' }, (request) => { alert('郵箱與密碼不匹配') } )
而後首頁的信息應該根據用戶信息作出相應的變化
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你已成功登陸', '沒有該用戶') }
這裏的代碼邏輯與上篇的基本一致,惟一的不一樣在於第一行代碼
let cookies = request.headers.cookie.split('; ') //['email=..@..', 'a=1']
爲何用;
字符來分割呢,這是由於能夠有多個cookie
通常來講常見的做用有以下兩個:
localhost:8080
的時候,服務器會給A一個獨一無二的id=00A
(這就是cookie),當用戶A訪問localhost:8080
的其餘網頁的時候,都會帶着那個獨一無二的id。當B用戶來訪問localhost:8080
的時候,服務器發現他沒有任何標識,也會給他一個獨一無二的id=00B
,因此藉助cookie服務器端就可以分清楚誰是誰了。taobao.com
去買點東西,添加了一個熱水壺、一部小米手機到購物車裏面,那麼服務器端能夠改寫你上面的cookie使之具體化「id=00A; cart=A1,A2」,表示你購物車裏面買了倆東西。你過幾天想起來了,去購物車裏面看,熱水壺、小米手機還在裏面。瀏覽器並不會刪除你存到硬盤上的cookie。
接下來能夠去搞一搞其餘的,像什麼session
LocalStorage
……(@ο@) 哇~
代碼連接sign_in.html