一、cookie
(1)设置 / 删除 cookie
// 导入express
const express = require('express');
// 创建应用对象
const app = express();
// 创建路由规则
// 设置 cookie
app.get('/set-cookie', (req, res) => {
// res.cookie('name','zhangsan') //会在浏览器关闭的时候,销毁
res.cookie('name', 'list', { maxAge: 60 * 1000 }); //max 最大 age年龄 当前1分钟
res.cookie('them', 'blue');
res.send('home');
})
// 删除 cookie
app.get('/remove-cookie', (req, res) => {
res.clearCookie('name');
res.send('删除成功~~');
})
// 监听端口,启动服务
app.listen(3000, () => {
console.log('服务已启动,端口 3000 正在监听中....')
})
(2)获取 cookie
官网:npmjs.com/package/cookie-parser
npm i cookie-parser
var cookieParser = require('cookie-parser')
app.use(cookieParser())
// 获取 cookie
app.get('/get-cookie', (req, res) => {
console.log(req.cookies)
res.send('获取 cookie 成功~~');
})
二、session
官网:https://www.npmjs.com/package/express-session
npm i express-session connect-mongo
(1)配置中间件
// 导入express
const express = require('express');
// 引入 express-session connect-mongo
const session = require('express-session');
const MongoStore = require('connect-mongo');
// 创建应用对象
const app = express();
// 设置 session 的中间件
app.use(session({
name: 'sid', //设置cookie的name,默认值是:connect.sid
secret: 'jiami', //参与加密的字符串(又称签名)
resave: false, //是否在每次请求时重新保存session
saveUninitialized: false, //是否为每次请求都设置一个cookie用来存储session的id
store: MongoStore.create({
mongoUrl: 'mongodb://127.0.0.1:27017/mydata' //数据库的连接配置
}),
cookie: {
httpOnly: true, //开启后前端无法通过 JS 操作
maxAge: 1000 * 20 //这一条 是控制 sessionID 的过期时间
}
}))
// 创建路由规则
app.get('/', (req, res) => {
res.send('home');
})
// 登录
app.get('/login', (req, res) => {
// username=admin&password=admin
if (req.query.username === 'admin' && req.query.password === 'admin') {
// 设置 session 信息
req.session.username = 'admin';
req.session.uid = '123456abc';
// 成功响应
res.send('登录成功');
return //有效避免报错:Cannot set headers after they are sent to the client ,该报错会导致数据库多次存储信息!
} else {
res.send('登录失败~~');
}
})
// session 的读取
app.get('/cart', (req, res) => {
// 检测 session 是否存在用户数据
if (req.session.username) {
res.send(`欢迎 ${req.session.username} 来到,购物车页面`)
} else {
res.send('您还没有登录~~')
}
})
// session 的销毁
app.get('/logout', (req, res) => {
req.session.destroy(() => {
res.send('退出成功')
})
})
// 监听端口,启动服务
app.listen(3000, () => {
console.log('服务已启动,端口 3000 正在监听中....')
})
运行后的效果
检测用户登录(避免新建无痕窗口,仍然能访问列表信息)
(1)新建 “中间件” 文件夹
module.exports = (req, res, next) => {
// 申明中间件检测登录
if (!req.session.username) {
return res.redirect('/login');
}
next();
}
在路由中使用:
总结
三、jwt 和 token
npm i jsonwebtoken
// 导入 jwt
const jwt = require('jsonwebtoken');
// 创建(生成)token
// let token = jwt.sign(用户数据,加密字符串,配置对象);
let token = jwt.sign({
username: 'zhangsan',
}, 'jiami', {
expiresIn: 60 * 60 * 24 * 7//设置一星期 //生命周期,单位秒
});
console.log('token---', token);
let t = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InpoYW5nc2FuIiwiaWF0IjoxNjg4MjI3NzIwLCJleHAiOjE2ODgyMjc3ODB9.450IFLlv-fRqKnt5Shv0c1vAIH5dYFUx6JW4JJ0vVZ8';
// 校验 token
jwt.verify(t, 'jiami', (err, data) => {
if (err) {
console.log('校验失败~~');
return
}
console.log(data)
})
项目中使用
(1)创建 api 路由文件
(2)app.js 引入路由
(3)Apifox 工具测试
(4)封装校验 token
如:拿账单列表的接口校验
// 声明中间件
const jwt = require('jsonwebtoken');
module.exports = (req, res, next) => {
// 获取 token
let token = req.get('token')
if (!token) {
return res.json({
code: '2003',
msg: 'token 缺失',
data: null
})
}
// 校验 token
jwt.verify(token, 'jiami', (err, data) => {
if (err) {
return res.json({
code: '2004',
msg: 'token 校验失败~~',
data: null
})
}
// 保存用户信息
req.user = data
// 如果 token 校验成功
next();
})
}
Apifox 工具测试
(1)先获取 token
(2)Headers 传 token