Node.js -- 会话控制

1. 会话介绍

所谓会话控制就是对会话进行控制
HTTP是一种无状态的协议,它没有办法区分多次的请求是否来自于同一个客户端,无法区分用户
而产品中又大量存在的这样的需求,所以我们需要通过会话控制来解决该问题
常见的会话控制技术有三种:

  • cookie
  • session
  • token

2. cookie 相关操作

2.1 cookie 设置

const express = require('express')

const router = express()

router.get('/set-cookie', (req, res) => { 
    res.cookie('name', 'qingtian')
    res.send('success')
})

router.listen(3000,() => {
    console.log('go');
})

这种创建路由规则的方式,在浏览器全部窗口关闭之后就不会再出现cookie 值;

七天之内免登录效果:

        res.cookie('name','lisi',{maxAge:30*1000})// maxAge 单位为ms

这种创建路由规则的方式在达到maxAge 时cookie 值才会消失。

2.2 删除 cookie

// 删除cookie 
router.get('/del-cookie', (req, res) => {
    res.clearCookie('name')
    res.send('删除成功')
})

2.3 获取cookie

// 获取cookie
router.get('/get-cookie', (req, res) => {
    console.log(req.cookies);
    res.send('获取成功')
})

3. session 相关操作

  1. 设置session
const express = require('express')
const session = require('express-session')
const MongoStore = require('connect-mongo')

const router = express()

router.use(session({
    name: 'sid',
    secret: 'atguigu',// 参与加密的字符串 也叫做加盐 、签名
    saveUninitialized: false,// 是否为每次请求都设置一个cookie用来存储session的id
    resave: true, //是否在每次请求时重新保存session
    store: MongoStore.create({
        mongoUrl: 'mongodb://127.0.0.1:27017/test' //数据库的连接配置
    }),
    cookie: {
        httpOnly: true, // 开启后前端无法通过 JS 操作
        maxAge: 1000 * 300 // 这一条 是控制 sessionID 的过期时间的!!!
    },
}))

// 设置session
router.get('/set-session', (req, res) => {
    req.session.username = 'wangwu'
    res.send('设置session')
})

router.listen(3000, () => {
    console.log('go');
})
  1. 获取session
// 获取session
router.get('/get-session', (req, res) => {
    console.log(req.session.username);
    if (req.session.username) {
        res.send(`你好${req.session.username}`)
    } else {
        res.send('登录 注册')
    }
})
  1. 销毁session
// 销毁session
router.get('/del-session', (req, res) => {
    req.session.destroy(() => {
        res.send('销毁session')
    })
})

4. cookie 和session 的区别

cookie和session的区别主要有如下几点:

  1. 存在的位置
  • cookie: 浏览器端
  • session: 服务端
  1. 安全性
  • cookie是以明文的方式存放在客户端的,安全性相对较低
  • session存放于服务器中,所以安全性相对较好
  1. 网络传输量
  • cookie设置内容过多会增大报文体积,会影响传输效率
  • session数据存储在服务器,只是通过cookie 传递id,所以不影响传输效率
  1. 存储限制
  • 刘览器限制单个cookis保存的数据不能超过4K,且单个域名下的存储数量也有限制
  • session数据存储在服务器中,所以没有这些限制

5. 补充知识 – CSRF跨站请求伪造

现有A,B两个网站,如果B网站发送了一个A网站内部的请求(比如退出登陆操作),那么就出现了CSRF跨站请求伪造;此时对A网站造成了影响,这是我们可以将退出登录的get 请求改为post 请求

6. token

JWT(JSON Web Token)是目前最流行的跨域认证解决方案,可用于基于token的身份验证
JWT使token的生成与校验更规范
我们可以使用jsonwebtoken 包来操作token

const jwt = require('jsonwebtoken')

// 生成token
let token = jwt.sign({
    username:'zhangsan'
}, 'atguigu', {
    expiresIn:60,// 单位为s
})

console.log(token);

// 校验token
let t = jwt.verify(token, 'atguigu', (err, data) => {
    if (err) {
        console.log('校验失败');
    }
    console.log(data);
})
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值