文章目录
一、介绍
所谓的会话控制就是对会话进行控制
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的操作,使用相对较少,大家了解即可
- 禁用所有cookie
- 删除cookie
- 查看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的区别
- 存在的位置
- cookie:浏览器端
- session:服务端
- 安全性
- cookie是以明文的方式存放在客户端,安全性相对较低
- session存放于服务器中,所以安全性相对较好
- 网络传输量
- cookie设置内容过大会增加报文体积,会影响传输效率
- session数据存储在服务器,只通过cookie传递id。所以不影响传输效率
- 存储限制
- 浏览器限制单个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);
})