1.会话控制-(cookie、session、token)
cookie、session多用于网站
token多用于app
1.1 session
1.1.1 在express框架中设置session
npm i express-session
npm i connect-mongo
使用session中间件
const express = require('express');
const session = require('express-session');
const MongoStore = require('connect-mongo')(session);
const app = express();
// 设置session的中间件
app.use(session({
name:'sid', // 设置session的cookie名称,默认是connect.sid
secret:'abcdefg', // 设置session的密钥,用于签名session的cookie
saveUninitialized:false, // 是否在会话初始化时保存会话,默认是false
resave:true, // 是否在每次请求时重新保存会话,默认是false
cookie:{
maxAge:1000*60*10
},
store:MongoStore.create({
url:'mongodb://localhost:27017/cookie' // 设置数据库连接字符串
}),
cookie:{
httpOnly:true, //开启后前端无法通过js操作
maxAge:1000*60 //cookie和session同步过期时间,默认是1000*60
}
}))
app.get('/', (req, res) => {
res.send('this is home page')
});
app.get('/set-cookie', (req, res) => {
res.setHeader('Content-Type', 'text/plain');
res.send('home')
});
// 启动服务器
app.listen(3000, () => {
console.log('server is running at port 3000');
});
1.1.2 session中session校验操作设置
const express = require('express');
const session = require('express-session');
const MongoStore = require('connect-mongo').default || require('connect-mongo');
const app = express();
// 设置session的中间件
app.use(session({
name:'sid', // 设置session的cookie名称,默认是connect.sid
secret:'abcdefg', // 设置session的密钥,用于签名session的cookie
saveUninitialized:false, // 是否在会话初始化时保存会话,默认是false
resave:true, // 是否在每次请求时重新保存会话,默认是false
cookie:{
maxAge:1000*60*10
},
store:MongoStore.create({
mongoUrl:'mongodb://localhost:27017/cookie' // 设置数据库连接字符串
}),
cookie:{
httpOnly:true, //开启后前端无法通过js操作
maxAge:1000*60 //cookie和session同步过期时间,默认是1000*60
}
}))
app.get('/', (req, res) => {
res.send('this is home page')
});
// 登录
app.get('/login', (req, res) => {
// 传入admin和password参数
if(req.query.username === 'admin' && req.query.password === '123456'){
// 设置session
req.session.username = 'admin';
req.session.password = '123456';
res.send('登录成功')
}else{
res.send('登录失败')
}
});
// 启动服务器
app.listen(3000, () => {
console.log('server is running at port 3000');
});
成功在MongoDB中查看到session数据
1.1.3 session的读取
1.1.4 session的销毁
使用destroy
1.2 cookie
1.2.1 在express框架中设置cookie-(cookie默认会在浏览器关闭时销毁)
1.2.1.1 默认cookie是在浏览器关闭时自动销毁的
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('this is home page')
});
app.get('/set-cookie', (req, res) => {
res.setHeader('Content-Type', 'text/plain');
res.cookie('name', 'tom');
res.send('home')
});
// 启动服务器
app.listen(3000, () => {
console.log('server is running at port 3000');
});
1.2.1.2 设置max-age实现cookie持久化(maxAge单位为毫秒,但报文内的单位为秒)
设置cookie生命周期为一分钟
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('this is home page')
});
app.get('/set-cookie', (req, res) => {
res.setHeader('Content-Type', 'text/plain');
res.cookie('name', 'jennie',{maxAge: 1000 * 60 });
res.send('home')
});
// 启动服务器
app.listen(3000, () => {
console.log('server is running at port 3000');
});
一分钟后再查看cookie
1.2.2 在express中删除cookie(使用clearCookie方法)
设置两个cookie(一个name,一个theme),实现只删除name的cookie
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('this is home page')
});
app.get('/set-cookie', (req, res) => {
res.setHeader('Content-Type', 'text/plain');
res.cookie('name', 'jennie',{maxAge: 1000 * 60 });
res.cookie('theme', 'dark')
res.send('home')
});
// 删除cookie
app.get('/delete-cookie', (req, res) => {
res.clearCookie('name');
res.send('删除成功')
});
// 启动服务器
app.listen(3000, () => {
console.log('server is running at port 3000');
});
结果:只剩下theme的cookie
1.2.3 在express框架中取出cookie
安装cookie-pasrser(就可以使用parser中间件)
npm i cookie-parser
导入cookieparser中间件
const express = require('express');
const cookieParser = require('cookie-parser');
const app = express();
app.use(cookieParser());
app.get('/', (req, res) => {
res.send('this is home page')
});
app.get('/set-cookie', (req, res) => {
res.setHeader('Content-Type', 'text/plain');
res.cookie('name', 'mark');
res.cookie('theme', 'dark')
res.send('home')
});
// 获取cookie
app.get('/get-cookie', (req, res) => {
console.log(req.cookies);
res.send(`欢迎${req.cookies.name},您的主题是${req.cookies.theme}`);
});
// 启动服务器
app.listen(3000, () => {
console.log('server is running at port 3000');
});
访问get-cookie路由查看效果
1.3 token(主要用于小程序、移动端)
2 JWT-(JSON Web Token)
2.1 创建生成token
// 导入jwt模块
const jwt = require('jsonwebtoken');
// 创建生成token(sign(用户数据,加密字符串,配置对象))
let token = jwt.sign({username: 'admin'}, 'secretKey', {expiresIn: 60});
console.log(token);
// 校验token
2.2 使用jwt.verify方法校验token
// 导入jwt模块
const jwt = require('jsonwebtoken');
// 创建生成token(sign(用户数据,加密字符串,配置对象))
let token = jwt.sign({username: 'admin'}, 'secretKey', {expiresIn: 60});
console.log(token);
// 校验token
jwt.verify(token, 'secretKey', (err, decode) => {
if (err) {
console.log('验证失败');
} else {
console.log('验证成功');
console.log(decode);
}
})
结果: