会话控制(cookie、session、token)

116 阅读2分钟

所谓会话控制就是 对会话进行控制对访问者的控制 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,就可查看相关操作

  1. 禁用所有 cookie

  2. 删除 cookie

  3. 查看 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 + ' 监听中...');

	});