前言
HTTP是一種無狀態(tài)協(xié)議,它沒有辦法區(qū)分多次的請(qǐng)求是否來自于同一個(gè)客戶端,無法區(qū)分用戶。而產(chǎn)品中又大量存在這樣的需求,所以我們需要通過會(huì)話控制來解決問題。
常見的會(huì)話控制有三種:
(1)cookie
(2)session
(3)token
一、cookie
1.1 cookie 是什么
cookie 是HTTP服務(wù)器發(fā)送到用戶瀏覽器并保存在本地的一小塊數(shù)據(jù)。cookie 是保存在瀏覽器端的一小塊數(shù)據(jù)
cookie 是按照域名劃分保存的
1.2 cookie 的特點(diǎn)
瀏覽器向服務(wù)器發(fā)送請(qǐng)求時(shí),會(huì)自動(dòng)將當(dāng)前域名下
可用的cookie設(shè)置在請(qǐng)求頭中,然后傳遞給服務(wù)器。這個(gè)請(qǐng)求頭的名字也叫‘cookie’,所以將cookie理解為一個(gè)HTTP請(qǐng)求頭也是可以的。
1.3 cookie 的運(yùn)行流程
填寫賬號(hào)和密碼校驗(yàn)身份,校驗(yàn)通過后下發(fā)cookie
有了cookie之后,后續(xù)向服務(wù)器發(fā)送請(qǐng)求時(shí),會(huì)自動(dòng)攜帶cookie
1.4 express 框架中設(shè)置cookie
// 導(dǎo)入express
const express=require('express');
// 創(chuàng)建應(yīng)用對(duì)象
const app =express();
// 創(chuàng)建路由規(guī)則
app.get('/set-cookie',(req,res)=>{
// res.cookie('name','zhangsan'); // 會(huì)在瀏覽器關(guān)閉的時(shí)候銷毀
res.cookie('name','list',{maxAge:60*1000}) // max 最大 age 年齡
res.send('home');
});
// 啟動(dòng)服務(wù)
app.listen(3000);
1.5 express 框架中刪除cookie
// 導(dǎo)入express
const express=require('express');
// 創(chuàng)建應(yīng)用對(duì)象
const app =express();
// 創(chuàng)建路由規(guī)則
app.get('/set-cookie',(req,res)=>{
// res.cookie('name','zhangsan'); // 會(huì)在瀏覽器關(guān)閉的時(shí)候銷毀
res.cookie('name','list',{maxAge:60*1000}) // max 最大 age 年齡
res.cookie('theme','blue');
res.send('home');
});
// 刪除cookie
app.get('/remove-cookie',(req,res)=>{
// 調(diào)用方法
res.clearCookie('name');
res.send('刪除成功');
})
// 啟動(dòng)服務(wù)
app.listen(3000);
1.6 express 框架中獲取cookie
使用cookie-parser
包
// 導(dǎo)入express
const express=require('express');
// 導(dǎo)入包
const cookieParser=require('cookie-parser')
// 創(chuàng)建應(yīng)用對(duì)象
const app =express();
app.use(cookieParser());
// 創(chuàng)建路由規(guī)則
app.get('/set-cookie',(req,res)=>{
// res.cookie('name','zhangsan'); // 會(huì)在瀏覽器關(guān)閉的時(shí)候銷毀
res.cookie('name','list',{maxAge:60*1000}) // max 最大 age 年齡
res.cookie('theme','blue');
res.send('home');
});
// 獲取cookie
app.get('/get-cookie',(req,res)=>{
// 獲取cookie
console.log(req.cookies);
res.send('獲取cookie');
})
// 啟動(dòng)服務(wù)
app.listen(3000);
二、session
2.1 session 是什么
session 是保存在服務(wù)器端的一塊兒數(shù)據(jù)
,保存當(dāng)前訪問用戶的相關(guān)信息。
2.2 session 的作用
實(shí)現(xiàn)會(huì)話控制,可以識(shí)別用戶的身份,快速獲取當(dāng)前用戶的相關(guān)信息。
2.3 session 的運(yùn)行流程
瀏覽器端填寫賬號(hào)和密碼傳給服務(wù)器校驗(yàn)身份,服務(wù)器校驗(yàn)通過后創(chuàng)建session信息
,然后將session_id
的值通過響應(yīng)頭返回給瀏覽器。瀏覽器有了cookie,下次發(fā)送請(qǐng)求時(shí)會(huì)自動(dòng)攜帶cookie,服務(wù)器通過cookie
中的session_id
的值確定用戶的身份。
2.4 session 和 cookie 的區(qū)別
(1)存在的位置
· cookie:瀏覽器端
· session:服務(wù)端
(2)安全性
· cookie是以明文的方式存放在客戶端的,安全性相對(duì)較低
· session存放于服務(wù)器中,所以安全性相對(duì)較好
(3)網(wǎng)絡(luò)傳輸質(zhì)量
· cookie設(shè)置內(nèi)容過多會(huì)增大報(bào)文體積,會(huì)影響傳輸效率
· session數(shù)據(jù)存儲(chǔ)在服務(wù)器,只是通過cookie傳遞id,所以不影響傳輸效率
(4)存儲(chǔ)限制
· 瀏覽器限制單個(gè)cookie保存的數(shù)據(jù)不能超過4k,且單個(gè)域名下的存儲(chǔ)數(shù)量也有限制
· session 數(shù)據(jù)存儲(chǔ)在服務(wù)器中,所以沒有這些限制
三、token
3.1 token 是什么
token是服務(wù)端生成并返回給HTTP客戶端的一串加密字符串,token中保存著用戶信息
3.2 token 的作用
實(shí)現(xiàn)會(huì)話控制,可以識(shí)別用戶的身份,主要用于移動(dòng)端APP
3.3 token 的工作流程
填寫賬號(hào)和密碼校驗(yàn)身份,校驗(yàn)通過后響應(yīng)token,token一般是在響應(yīng)體中返回給客戶端的
后續(xù)發(fā)送請(qǐng)求時(shí),需要手動(dòng)
將token添加在請(qǐng)求報(bào)文中,一般是放在請(qǐng)求頭中,cookie為自動(dòng)攜帶
3.4 token 的特點(diǎn)
(1)服務(wù)器端壓力更小
--------數(shù)據(jù)存儲(chǔ)在客戶端
(2)相對(duì)更安全
--------數(shù)據(jù)加密
--------可以避免CSRF(跨站請(qǐng)求偽造)
(3)擴(kuò)展性更強(qiáng)
--------服務(wù)間可以共享
--------增加服務(wù)節(jié)點(diǎn)更簡單文章來源:http://www.zghlxwxcb.cn/news/detail-500704.html
3.5 JWT
JWT(JSON Web Token)是目前最流行的跨域認(rèn)證解決方案,可用于基于token的身份驗(yàn)證
JWT使token的生成與校驗(yàn)更規(guī)范
我們可以使用JWT包來操作token,使用前先安裝包:npm i jsonwebtoken
文章來源地址http://www.zghlxwxcb.cn/news/detail-500704.html
// 導(dǎo)入 jwt
const jwt=require('jsonwebtoken')
// 1. 創(chuàng)建(生成)token
// let token = jwt.sign(用戶數(shù)據(jù),加密字符串,配置對(duì)象);
let token=jwt.sign({
username:'zhangsan'
},'aaaaaa',{
expiresIn:60, // 單位是秒
})
console.log(token)
let t='eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InpoYW5nc2FuIiwiaWF0IjoxNjg2Nzk1ODA5LCJleHAiOjE2ODY3OTU4Njl9.KRZxCJFb9ry5vVL2w-n6tvqaG8JQrPqp8Ej0BwT6myM'
// 校驗(yàn) token
jwt.verify(t,'aaaaaa',(err,data)=>{
if(err){
console.log('校驗(yàn)失敗');
return
}
console.log(data);
})
到了這里,關(guān)于九、會(huì)話控制——cookie、session、token的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!