所谓会话控制就是 对会话进行控制(对访问者的控制 cookie)
一、介绍
产生原因:HTTP 是一种无状态的协议,它没有办法区分多次的请求是否来自于同一个客户端, 无法区分用户
常见的会话控制技术有三种:
- cookie
- session
- token
二、 cookie
2.1 cookie 是什么
cookie 是 HTTP* 服务器发送到用户浏览器*并保存在本地的一小块数据
cookie 是保存在浏览器端的一小块数据
cookie 是按照域名划分保存的(通过 ip 地址不同进行划分)
cookie 是放在请求头当中传递给服务器的
简单示例:
2.2 cookie 的特点
浏览器向服务器发送请求时,会自动将 当前域名下 可用的 cookie 设置在请求头中,然后传递给服务器
这个请求头的名字也叫 cookie ,所以将 cookie 理解为一个 HTTP 的请求头也是可以的
2.3 cookie 的运行流程
填写账号和密码校验身份,校验通过后下发 cookie
有了 cookie 之后,后续向服务器发送请求时就会自动携带 cookie(set-cookie:name=zhangsan)
2.4 浏览器操作 cookie(了解)
浏览器操作 cookie 的操作,使用相对较少,大家了解即可
浏览器设置中搜索 cookie,就可查看相关操作
-
禁用所有 cookie
-
删除 cookie
-
查看 cookie
2.5 cookie 的代码操作
express 中可以使用 cookie-parser 进行处理
用户登录添加 cookie (res.cookie()),用户退出删除 cookie (res.clearcookie())
//导入express
const express = require('express');
//创建对象
const app = express();
//创建路由规则
app.get('/', (req, res) => {
res.send('home');
})
app.get('/set-cookie', (req, res) => {
// res.cookie("name","zhangSan");//浏览器关闭时销毁
res.cookie("name","liSi",{MaxAge:120*1000});//关闭浏览器生命周期仍然存在 单位毫秒;
res.send('set-cookie');
})
app.get('/cookie-clear',(req, res) => {
res.clearCookie("name");
res.send('clear-cookie');
})
//启动服务
app.listen(3000);
可以设置多个 cookie
不同浏览器中的 cookie 是相互独立的,不共享
2.6 获取 cookie (cookie-parser)
作用: 将返回req.cookies,选择需要的信息使用即可,相对于一个中间件的使用
完整使用示例:
//导入cookie-parser
const cookieParser = require('cookie-parser')
//加载
app.use(cookieParser());
//创建路由规则
app.get('/', (req, res) => {
console.log(res.cookies);//返回cookie的所有内容
res.send(`home 欢迎${req.cookies.name}`);
})
三、 session
3.1 session 是什么
session 是保存在 服务器端的一块儿数据 ,保存当前访问用户的相关信息
3.2 session 的作用
实现会话控制,可以识别用户的身份,快速获取当前用户的相关信息
获取用户的验证码,获取用户权限…
3.3 session 运行流程
填写账号和密码校验身份,校验通过后创建 session(id:00365,name:’liqiang’…) 信息 ,然后将 session_id(00365) 的值通过响应头返回给浏览器
有了 cookie,下次发送请求时会自动携带 cookie,服务器通过 cookie 中的 session_id (00365) 的值确定用户的身份
3.4 session 的代码操作
express 中可以使用 express-session (包) 对 session 进行操作
session 中间件的设置及作用:
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/project' //数据库的连接配置
}),
cookie: {
httpOnly: true, // 开启后前端无法通过 JS 操作
maxAge: 1000 * 300 // 这一条 是控制 sessionID 的过期时间的!!!
},
}))
//创建 session
app.get('/login', (req, res) => {
//设置session
req.session.username = 'zhangsan';
req.session.email = 'zhangsan@qq.com'
res.send('登录成功');
})
//获取 session
app.get('/home', (req, res) => {
console.log('session的信息');
console.log(req.session.username);
if (req.session.username) {
res.send(`你好 ${req.session.username}`);
}else{
res.send('登录 注册');
}
})
//销毁 session
app.get('/logout', (req, res) => {
//销毁session
// res.send('设置session');
req.session.destroy(() => {
res.send('成功退出');
});
});
app.listen(3000, () => {
console.log('服务已经启动, 端口 ' + 3000 + ' 监听中...');
});