目录
session 是保存在 服务端的一块数据 ,保存当前访问用户的相关息
session登录 符合所有匹配条件的才可设置session信息
一、简介
服务端要区分用户,HTTP是一种无状态的协议,但是没有办法区分多次请求是否来自同一客户端。为了解决该问题,一般我们通过 会话控制来解决。常见的会话控制有三种:cookie、session、token
二、cookie
-
cookie是HTTP服务器发送到 用户浏览器 并保存 在本地的一小块数据
- cookie是按照域名划分保存的
- 浏览器向服务器发送请求时,会自动携带当前域名下的可用 cookie 设置在请求头中,然后传递给服务器。这个请求头的名字也叫 cookie
- ie浏览器中可查看cookie,maxAge为cookie存活的生命周期,只要生命周期到期后,cookie才会失效。
const express = require('express')
//中间件
const cookieParser = require('cookie-parser');
const { log } = require('console');
const app = express();
app.use(cookieParser());
app.get('/', (req, res) => {
res.send('home')
});
app.get('/set-cookie', (req, res) => {
//会在浏览器关闭时销毁 maxAge:存活时间,单位毫秒
res.cookie('name', 'hello', {
maxAge: 1000 * 60
})
res.cookie('theme', 'blue')
res.send('home')
});
//获取cookie
app.get('/get-cookie', (req, res) => {
console.log(req.cookies);
res.send(`获取cookie+${req.cookies.name}`)
});
//删除 cookie
app.get('/remove-cookie', (req, res) => {
//删除方法
res.clearCookie('name')
res.send('删除成功')
});
app.listen(3000, () => {
console.log('success');
})
-
创建cookie
-
获取cookie
-
删除的cookie
三、session
-
session 是保存在 服务端的一块数据 ,保存当前访问用户的相关息
- 实现会话控制,可识别用户身份,快速获取当前用户的相关信息
- 填写账号密校验身份,校验通过后 创建 session 对象,然后将 session_id 的值 通过响应头返回给浏览器 。浏览器获得 cookie ,下次发请求就会携带 cookie 。服务端通过 cookie 中的 session_id 确定用户身份。
1. 安装包
npm i express-session connect-mongo
2. 设置session中间件
const express = require('express')
const session = require('express-session')
const MongoStore = require('connect-mongo')
//创建应用对象
const app = express();
//设置session 中间件
app.use(session({
//设置cookie的name,默认值是connect.sid,也就是session_id
name: 'sid',
//参与加密的字符串又称为签名
secret: 'BadRabbit',
//是否在每次请求后保存session
resave: true,
//是否为每次请求都设置一个cookie来存储session的id
saveUninitialized: false,
//数据库连接配置
store: MongoStore.create({
mongoUrl: 'mongodb://127.0.0.1:27017/project'
}),
cookie: {
//开启后前端无法通过js对其进行访问
httpOnly: true,
//控制cookie,session_id的过期时间
maxAge: 1000 * 60 * 5
}
}))
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') {
req.session.username = 'admin';
req.session.uid = '258kkld'
res.send('登录成功')
} else {
res.send('登录失败')
}
})
//session读取
app.get('/cart', (req, res) => {
//检测session 是否存在用户数据,是否有标识
if (req.session.username) {
res.send('购物车页面')
} else {
res.send('您还未登录')
}
})
//session销毁
app.get('/logout', (req, res) => {
req.session.destroy((err) => {
if (err) {
res.send('退出失败')
}
res.send('退出成功')
})
})
app.listen(3000, () => {
console.log('success');
})
-
session登录 符合所有匹配条件的才可设置session信息
-
session销毁
-
session获取 通过检测session是否存在标识
四、session和cookie的区别
1. 存储的位置
- cookie :浏览器
- session:服务端
2. 安全性
- cookie是以明文方式存储在客户端的,安全较低
- session是存放于服务端的,安全性相对较好
3.网络传输
- cookie设置内容过多会增大报文体积,会影响传输效率
- session通过cookie传递session_id,不影响效率
4. 存储限制
- 浏览器对cookie的存储是有约束的
- session数据存储在服务端,没有这些限制
5. 原理
- 浏览器第一次接收到cookie信息后,接下来每次向同一个服务器发送请求时,都会发送之前存在本地的cookie。除非生命到头,或者被销毁。
- 服务端为每个过来的用户保存一个session信息,为了以后方便知道session的到底是谁,所以把每个 session_id 传给浏览器的 cookie 。这样下次浏览器再次访问服务器的时候,浏览器携带的 cookie 把 session_id 告诉了服务器,然后服务器就能知道具体的session是谁了。