做網(wǎng)站的點(diǎn)子站長之家ppt素材
一、會話控制
1.介紹
所謂會話控制就是 對會話進(jìn)行控制
HTTP
是一種無狀態(tài)的協(xié)議,它沒有辦法區(qū)分多次的請求是否來自于同一個客戶端, 無法區(qū)分用戶
而產(chǎn)品中又大量存在的這樣的需求,所以我們需要通過 會話控制 來解決該問題
常見的會話控制技術(shù)有三種:
- cookie
- session
- token
2. cookie
1 cookie
是什么
cookie
是 HTTP
服務(wù)器發(fā)送到用戶瀏覽器并保存在本地的一小塊數(shù)據(jù)
cookie
是保存在瀏覽器端的一小塊數(shù)據(jù)
cookie
是按照域名劃分保存的
簡單示例:
域名 | cookie |
---|---|
www.baidu.com | a=100;b=200 |
www.bilibili.com | xid=1020abce121; hm=112411213 |
jd.com | x=100; ocw=12414cce |
2. cookie
的特點(diǎn)
瀏覽器向服務(wù)器發(fā)送請求時,會自動將 當(dāng)前域名下 可用的 cookie
設(shè)置在請求頭中,然后傳遞給服務(wù)器,這個請求頭的名字也叫 cookie
,所以將 cookie
理解為一個 HTTP
的請求頭也是可以的
3. cookie
的運(yùn)行流程
填寫賬號和密碼校驗(yàn)身份,校驗(yàn)通過后下發(fā) cookie
有了 cookie
之后,后續(xù)向服務(wù)器發(fā)送請求時,就會自動攜帶 cookie
4. cookie
的代碼操作
express
中可以使用 cookie-parser
進(jìn)行處理
const express =require('express');
//1. 安裝 cookie-parser npm i cookie-parser
//2. 引入 cookieParser 包
const cookieParser = require('cookie-parser');
const app = express();
//3. 設(shè)置 cookieParser 中間件
app.use(cookieParser());
//4-1 設(shè)置 cookie
app.get('/set-cookie', (request, response) => {// 不帶時效性response.cookie('username','wangwu');// 帶時效性response.cookie('email','23123456@qq.com', {maxAge: 5*60*1000 });//響應(yīng)response.send('Cookie的設(shè)置');
});
//4-2 讀取 cookie
app.get('/get-cookie', (request, response) => {//讀取 cookieconsole.log(request.cookies);//響應(yīng)體response.send('Cookie的讀取');
});
//4-3 刪除cookie
app.get('/delete-cookie', (request, response) => {//刪除response.clearCookie('username');//響應(yīng)response.send('cookie 的清除');
});
//4. 啟動服務(wù)
app.listen(3000, () => {console.log('服務(wù)已經(jīng)啟動....');
});
不同瀏覽器中的 cookie 是相互獨(dú)立的,不共享
3. session
1. session
是什么
session
是保存在 服務(wù)器端的一塊兒數(shù)據(jù) ,保存當(dāng)前訪問用戶的相關(guān)信息
2. session
的作用
實(shí)現(xiàn)會話控制,可以識別用戶的身份,快速獲取當(dāng)前用戶的相關(guān)信息
3. session
運(yùn)行流程
填寫賬號和密碼校驗(yàn)身份,校驗(yàn)通過后創(chuàng)建 session
信息 ,然后將 session_id
的值通過響應(yīng)頭返回
給瀏覽器
有了 cookie
,下次發(fā)送請求時會自動攜帶 cookie
,服務(wù)器通過 cookie
中的 session_id
的值確定用戶的身份
4. session
的代碼操作
express
中可以使用 express-session
對 session
進(jìn)行操作
const express = require('express');
//1. 安裝包 npm i express-session connect-mongo
//2. 引入 express-session connect-mongo
const session = require("express-session");
const MongoStore = require('connect-mongo');
const app = express();
//3. 設(shè)置 session 的中間件
app.use(session({name: 'sid', //設(shè)置cookie的name,默認(rèn)值是:connect.sidsecret: 'secret', //參與加密的字符串(又稱簽名)saveUninitialized: false, //是否為每次請求都設(shè)置一個cookie用來存儲session的idresave: true, //是否在每次請求時重新保存sessionstore: MongoStore.create({mongoUrl: 'mongodb://127.0.0.1:27017/project' //數(shù)據(jù)庫的連接配置}),cookie: {httpOnly: true, // 開啟后前端無法通過 JS 操作maxAge: 1000 * 300 // 這一條 是控制 sessionID 的過期時間的!!!},
}))
//創(chuàng)建 session
app.get('/login', (req, res) => {//設(shè)置sessionreq.session.username = 'zhangsan';req.session.email = 'zhangsan@qq.com'res.send('登錄成功');
})
//獲取 session
app.get('/home', (req, res) => {console.log('session的信息');console.log(req.session.username);if (req.session.username) {res.send(`你好 ${req.session.username}`);}else{res.send('登錄 注冊');}
})
//銷毀 session
app.get('/logout', (req, res) => {//銷毀session// res.send('設(shè)置session');req.session.destroy(() => {res.send('成功退出');});
});
app.listen(3000, () => {console.log('服務(wù)已經(jīng)啟動, 端口 ' + 3000 + ' 監(jiān)聽中...');
});
session
示例
4. session
和 cookie
的區(qū)別
cookie
和 session
的區(qū)別主要有如下幾點(diǎn):
- 存在的位置
cookie
:瀏覽器端session
:服務(wù)端
- 安全性
cookie
是以明文的方式存放在客戶端的,安全性相對較低session
存放于服務(wù)器中,所以安全性 相對 較好
- 網(wǎng)絡(luò)傳輸量
cookie
設(shè)置內(nèi)容過多會增大報(bào)文體積, 會影響傳輸效率session
數(shù)據(jù)存儲在服務(wù)器,只是通過cookie
傳遞id
,所以不影響傳輸效率
- 存儲限制
- 瀏覽器限制單個
cookie
保存的數(shù)據(jù)不能超過4K
,且單個域名下的存儲數(shù)量也有限制 session
數(shù)據(jù)存儲在服務(wù)器中,所以沒有這些限制
- 瀏覽器限制單個
5. token
1. token
是什么
token
是服務(wù)端生成并返回給 HTTP
客戶端的一串加密字符串, token
中保存著 用戶信息
2. token
的作用
實(shí)現(xiàn)會話控制,可以識別用戶的身份,主要用于移動端 APP
3. token
的工作流程
填寫賬號和密碼校驗(yàn)身份,校驗(yàn)通過后響應(yīng) token
,token
一般是在響應(yīng)體中返回給客戶端的
后續(xù)發(fā)送請求時,需要手動將 token 添加在請求報(bào)文中,一般是放在請求頭中
4. token
的特點(diǎn)
- 服務(wù)端壓力更小
- 數(shù)據(jù)存儲在客戶端
- 相對更安全
- 數(shù)據(jù)加密
- 可以避免 CSRF(跨站請求偽造)
- 擴(kuò)展性更強(qiáng)
- 服務(wù)間可以共享
- 增加服務(wù)節(jié)點(diǎn)更簡單
5. JWT
JWT(JSON Web Token )
是目前最流行的跨域認(rèn)證解決方案,可用于基于 token
的身份驗(yàn)證
JWT
使 token
的生成與校驗(yàn)更規(guī)范
我們可以使用 jsonwebtoken
包 來操作 token
//導(dǎo)入 jsonwebtokan
const jwt = require('jsonwebtoken');
//創(chuàng)建 token
// jwt.sign(數(shù)據(jù), 加密字符串, 配置對象)
let token = jwt.sign({username: 'zhangsan'},'secret',{expiresIn: 60 //單位是 秒}
)
//解析 token
jwt.verify(token, 'secret', (err, data) => {if(err){console.log('校驗(yàn)失敗~~');return}console.log(data);
})
外部閱讀https://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html
token示例
二、 附錄
1. 本地域名
所謂本地域名就是 只能在本機(jī)使用的域名 ,一般在開發(fā)階段使用
- 操作流程
編輯文件C:\Windows\System32\drivers\etc\hosts
127.0.0.1 www.baidu.com
如果修改失敗, 可以修改該文件的權(quán)限
- 原理
在地址欄輸入 域名 之后,瀏覽器會先進(jìn)行DNS(Domain Name System)
查詢,獲取該域名對應(yīng)的IP
地址
請求會發(fā)送到DNS
服務(wù)器,可以 根據(jù)域名返回IP
地址
可以通過ipconfig /all
查看本機(jī)的DNS
服務(wù)器
hosts
文件也可以設(shè)置域名與IP
的映射關(guān)系,在發(fā)送請求前,可以通過該文件獲取域名的IP
地址
2. HTTPS
(在服務(wù)器端完成)
https
本意示 http + SSL(Secure Sockets Layer 安全套接層)
https
可以 加密HTTP
報(bào)文,所以大家也可以理解為是安全的HTTP
工具官網(wǎng):https://certbot.eff.org
操作流程:
- 下載工具:
https://dl.eff.org/certbot-beta-installer-win_amd64.exe
- 安裝工具
- 管理員命令:
certbot certonly --standalone
- 代碼配置如下:
const https = require('https')
https.createServer({key: fs.readFileSync('/etc/letsencrypt/path/to/privkey.pem'),cert: fs.readFileSync('/etc/letsencrypt/path/to/cert.pem'),ca: fs.readFileSync('/etc/letsencrypt/path/to/chain.pem'),}, app
)
.listen(443, ()=>{console.log('Listening...')
})
- 證書更新,證書有效期為三個月,可以通過下面的命令更新
## 一般更新
certbot renew
## 強(qiáng)制更新
certbot --force-renewal