Express 设置会话

一、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
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值