上篇介紹了註冊的基本流程,下篇簡單的講講登陸的流程以及Cookie的出現javascript
當你在瀏覽器的輸入框裏輸入localhost:8080/sign_in
的時候,會發起GET
請求,去訪問sign_in.html
php
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佈局與上篇的佈局基本同樣,略去不表~html
依然是上篇的套路,得到用戶formdata後,分析數據,和數據庫裏面的比對java
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
,也就是今天的主角--Cookienode
其實這和日常上網的情形相似的,有時候咱們訪問一些購物網站,並無登陸,可是你在購物車裏面添加東西了,當你逛了之後再回來的時候,發現購物車裏面有你的記錄,幫你作這個事的也是cookie。git
由於HTTP協議是無狀態的,即服務器不知道用戶上一次作了什麼,這嚴重阻礙了交互式Web應用程序的實現。在典型的網上購物場景中,用戶瀏覽了幾個頁面,買了一盒餅乾和兩瓶飲料。最後結賬時,因爲HTTP的無狀態性,不經過額外的手段,服務器並不知道用戶到底買了什麼,因此Cookie就是用來繞開HTTP的無狀態性的「額外手段」之一。服務器能夠設置或讀取Cookies中包含信息,藉此維護用戶跟服務器會話中的狀態。github
能夠看出,當你在sign_in發起GET
請求並設置了Set-Cookie
以後,其餘的同源的頁面,又都會帶上Cookie
,也就能保證同源的網頁向服務器發起請求的時候,服務器可以明白,你己經是登陸的用戶了,與那些沒有拿到cookie的頁面區別開來。數據庫
爲何要在cookie裏面寫上HttpOnly
呢,由於這個能夠防止有些牛人使用JS
修改Cookie的內容。後端
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