会话控制
Posted luckest
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了会话控制相关的知识,希望对你有一定的参考价值。
会话控制
1、介绍
所谓会话控制,就是对会话进行控制。
HTTP是一种无状态协议,它没有办法区分多次请求是否来自同一个客户端,无法区别用户。
而产品中又大量存在这样的需求,所以我们需要通过会话控制来解决这个问题。
常见的会话控制技术有三种:
- cookie
- session
- token
2、cookie
2.1、cookie是什么?
cookie是HTTP服务器发送到用户浏览器并保存在本地的一小块数据。
cookie是保存在浏览器端的一小块数据。
cookie是按照域名划分保存的。
简单示例:
域名 | cookie |
---|---|
www.baidu.com | a=100;b=200 |
www.bilibili.com | xid=102abce121;hm=12312323 |
2.2、cookie的特点
浏览器向服务器发送请求的时候,会自动将当前域名下可以使用的cookie设置在请求头中,然后传递给服务器。
这个请求头的名字也叫做cookie,所以将cookie理解为HTTP的请求头也可以。
服务器就可以通过浏览器传过来的cookie中的值,来辨认客户的身份。
2.3、express中操作cookie
2.3.1、设置和删除 cookie
const express = require(\'express\');
const app = express();
app.get(\'/set-cookie\', (req, res) =>
// 设置cookie
// res.cookie(\'name\', \'zhangsan\'); // 会在浏览器关闭的时候,销毁
res.cookie(\'name\', \'lisi\', maxAge: 60 * 1000); // maxAge的单位是毫秒,这里设为有效期一分钟
res.send(\'设置cookie\');
);
app.get(\'/remove-cookie\', (req, res) =>
// 删除cookie
res.clearCookie(\'name\'); // 比如用户退出登录的时候删除
res.send(\'删除cookie\');
);
app.listen(3000);
2.3.2、获取cookie
使用cookie-parser库:
npm i cookie-parser
const express = require(\'express\');
const cookieParser = require(\'cookie-parser\');
const app = express();
app.use(cookieParser());
app.get(\'/set-cookie\', (req, res) =>
// 设置cookie
// res.cookie(\'name\', \'zhangsan\'); // 会在浏览器关闭的时候,销毁
res.cookie(\'name\', \'lisi\', maxAge: 60 * 1000); // maxAge的单位是毫秒,这里设为有效期一分钟
res.send(\'设置cookie\');
);
app.get(\'/remove-cookie\', (req, res) =>
// 删除cookie
res.clearCookie(\'name\'); // 比如用户退出登录的时候删除
res.send(\'删除cookie\');
);
// 获取cookie
app.get(\'/get-cookie\', (req, res) =>
console.log(req.cookies);
res.send(\'获取cookie成功\');
)
app.listen(3000);
3、session
3.1、session是什么?
session是保存服务器端的一块数据,保存当前访问用户的相关信息。
3.2、session的作用
实现会话控制,可以识别用户的身份,快速获取当前用户的相关信息。
3.3、session运行流程
填写账号密码校验身份,校验通过之后创建session信息,然后将session_id的值通过响应头set-cookie返回给浏览器。
有了cookie,下次发送请求的时候会自动携带这个cookie,服务器通过cookie中的session_id的值确定用户的身份。
3.4、express中操作session
express中可以使用express-session对session进行操作。
npm i express-session
npm i connect-mongo(用户连接数据库,配置好之后,下述代码中的session会自动在数据库中进行增删改查)
const express = require(\'express\');
const session = require(\'express-session\');
const MongoStore = require(\'connect-mongo\');
const app = express();
// 设置session中间件
app.use(session(
name: \'sid\', // 设置cookie的name,默认值是connect.id
secret: \'chen\', // 参与加密的字符串(又称签名)
saveUninitialized: false, // 是否在每次请求都设置一个cookie用来存储session的id
resave: true, // 是否在每次请求时重新保存session
store: MongoStore.create(
mongoUrl: \'mongodb://127.0.0.1:27017/project\' // 数据库的连接配置
),
cookie:
httpOnly: true, // 开启后前端无法通过JS访问和操作(document.cookie访问)
maxAge: 1000 * 300 // 这一条是控制sessionID的过期时间,浏览器端cookie过期了,服务端的session也过期了
));
// 首页路由
app.get(\'/home\', (req, res) =>
res.send(\'home\');
);
// 登录
app.get(\'/login\', (req, res) =>
// username=admin&password=admin
if (req.query.username === \'admin\' && req.query.password === \'admin\')
// 设置session信息
req.session.username = \'admin\';
// 成功响应
res.send(\'登录成功\');
else
res.send(\'登录失败\');
);
// session的读取
app.get(\'/car\', (req, res) =>
// 检测session是否存在用户数据
if (req.session.username)
res.send(\'购物车页面,欢迎光~~~临\');
else
res.send(\'请登录\');
);
// session的销毁
app.get(\'/logout\', (req, res) =>
req.session.destroy(() =>
res.send(\'退出成功\');
);
);
app.listen(3000);
4、session和cookie的区别
- 1、存在位置
- cookie:浏览器端
- session:服务器端
- 2、安全性
- cookie是以明文的方式存放在客户端的,安全性相对较低
- session是存在于服务器中,安全性较好
- 3、网络传输量
- cookie设置内容过多会增大报文体积,影响传输效率
- session数据存储在服务器,只是通过cookie传递id,所以不影响传输效率
- 4、存储限制
- 浏览器限制单个cookie的保存数据不能超过4k,且单个域名下的存储数量也有限制
- session存储在服务器中,没有这些限制。
5、token
5.1、token是什么?
token是服务端生成并返回给HTTP客户端的一串加密字符串,token中保存着用户信息。
5.2、token的作用
实现会话控制,可以识别用户的身份,主要用户移动端APP
5.3、token的工作流程
填写账号和密码校验身份,校验通过之后服务器创建并响应token,token一般是在响应体中返回给客户端的。
后续发送请求的时候,需要手动将token添加在请求报文中,一般是放在请求头中。
5.4、token的特点
- 服务端压力更小
- 因为数据是存储在客户端
- 相对更安全
- 数据加密
- 可以避免CSRF(跨站请求伪造)
- 扩展性更强
- 服务之间可以共享
- 增加服务节点更简单
5.5、JWT
JWT(JSON Web Token)是目前最流行的跨域认证解决方案,可以基于token进行身份验证。
JWT使token生成和校验更加规范。
我们可以使用jsonwebtoken包来操作token。
npm i jsonwebtoken
const express = require(\'express\');
const jwt = require(\'jsonwebtoken\');
const app = express();
// 创建token
// let token = jwt.sign(用户数据,加密字符串,配置对象)
// let token = jwt.sign(
// username: \'zhangsan\'
// , \'chen\',
// expiresIn: 3600 // 单位是秒
// );
// console.log(token);
let token = \'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InpoYW5nc2FuIiwiaWF0IjoxNjg0MTM1MjIwLCJleHAiOjE2ODQxMzg4MjB9.x2pzuCKp78BDzMv1kzsukS-W9TkLUFgC3PYGUyhqeSo\';
// 校验token
jwt.verify(token, \'chen\', (err, data) =>
if (err)
console.log(\'校验失败\');
return;
console.log(data);
);
app.listen(3000);
会话 控制终端 setsid
1、setsid 设置会话id,作用:新回话、新进程组、没有控制终端。必须不是组长才行。 getpid getpgrp getsid。
2、一个会话可以有一个控制终端,通常是登录到其上的终端设备、伪终端(网络登录)。建立与终端链接的会话首进程是控制进程。一个会话一个前台进程 多个后台进程。如果有控制终端 则有一个前台进程组。终端接口检测到网络断开,将发挂断sighup?信号给会话首进程。
以上是关于会话控制的主要内容,如果未能解决你的问题,请参考以下文章