会话控制(cookie、session、token)

10 篇文章 0 订阅
4 篇文章 0 订阅

一、介绍

所谓的会话控制就是对会话进行控制

HTTP是一种无状态的协议,他没有办法区分多次的请求是否来自同一个客户端,无法区分用户,而产品中又大量存在这样的需求,所以我们需要回话控制来解决该问题

常见的会话控制技术有三种:

  • cookie
  • session
  • token

二、cookie

2.1 cookie是什么

cookie是HTTP服务器发送到用户浏览器并保存在本地的一小块数据

cookie是保存在浏览器端的一小块数据

cookie是按照域名划分的

2.2 cookie的特点

浏览器向服务器发送请求时,会自动将当前域名下可用的cookie设置在请求头中,然后传递给服务器

这个请求头的名字也叫cookie所以将cookie理解为一个HTTP的请求头也是可以的

有了cookie之后,后续向服务器发送请求时,就会自动携带cookie

2.3 浏览器操作cookie

浏览器操作cookie的操作,使用相对较少,大家了解即可

  1. 禁用所有cookie
  2. 删除cookie
  3. 查看cookie

2.4 cookie的创建、删除、获取

安装一个解析cookie的中间件

npm i cookie-parser
// 导入express
const express=require('express');
const { get } = require('http');
const cookieParser=require('cookie-parser');

//创建应用对象
const app=express();
app.use(cookieParser());

// 创建路由规则
app.get('/set-cookie',(req,res)=>{
    // res.cookie('name','zhangsan');//会在浏览器关闭的时候销毁
    res.cookie('name','lisi',{maxAge:60*1000})//设置cookie存活时间为60s
    res.cookie('theme','blue');//再设置一个cookie
    res.send('home');
});

//删除cookie 
app.get('/remove-cookie',(req,res)=>{
    //调用方法
    res.clearCookie('name');
    res.send('删除成功');
})

app.get('/get-cookie',(req,res)=>{
    //获取cookie
    console.log(req.cookies);
    res.send(`欢迎您${req.cookies.name}`)
})
// 启动服务
app.listen(3000);

三、session

3.1 session是什么

session是保存在服务器端的一块数据,保存当前访问用户的相关信息

3.2 session的作用

实现会话控制,可识别用户的身份,快速获取当前用户的相关信息

3.3 session运行流程

请添加图片描述

3.4 session的操作

// 导入express
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.设置session的中间件
app.use(session({
    name:'sid', //设置cookie的name 默认值是connect.sid
    secret:'atguigu',//参与加密的字符串(又称签名)
    saveUninitialized:false,//是否为每次请求都设置一个cookie用来存储session 的id
    resave:true,//是否在每次请求时,重新保存session
    store:MongoStore.create({
        mongoUrl:'mongodb://127.0.0.1:27017/bilibili'//数据库的连接配置
    }),
    cookie:{
        httpOnly:true,//开启后,前端无法通过JS操作
        maxAge:1000*300//这一条是控制sessionID的过期时间
    },
}))


// 创建路由规则
app.get('/',(req,res)=>{
    res.send('home');
});

//session的设置 登录
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='23323232dd'
        //成功响应
        res.send('登陆成功')
    }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);

四、session和cookie的区别

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

五、token

5.1 token是什么

token是服务端生成并返回给HTT客户端的一串加密字符串,token保存着用户信息

5.2 token的作用

实现会话控制,可以识别用户身份,主要用于移动端app

5.3 token的工作流程

请添加图片描述

请添加图片描述

5.4 token的特点

  • 服务端的压力更小
    • 数据存储在客户端
  • 相对更安全
    • 数据加密
    • 可以避免CSRF(跨站请求伪造)
  • 扩展性更强
    • 服务间可以共享
    • 增加服务节点更简单

5.5 JWT

JWT ( JSON Web Token)是目前最流行的跨域认证解决方案,可用于记忆token的身份验证

JWT是token的生成于校验更规范

我们可以使用jsonwebtoken 包来操作token

//导入jwt
const jwt=require('jsonwebtoken');

//创建(生成)token
// let token =jwt.sign(用户数据,加密字符串,配置对象);
let token =jwt.sign({
    username:'zhangsan'
},'atguigu',{
    expiresIn:60,//单位是秒
});
console.log(token);


let t='eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InpoYW5nc2FuIiwiaWF0IjoxNzAyMzUxNjI1LCJleHAiOjE3MDIzNTE2ODV9.egrS6b6pem4LsZSvXvRzE7UuplHuO6K8OjYX2l7JHq0'
//校验token
jwt.verify(t,'atguigu',(err,data)=>{
    if(err){
        console.log('校验失败~~');
        return;
    }
    console.log(data);
})
  • 20
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值