会话控制

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

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?信号给会话首进程。

 

以上是关于会话控制的主要内容,如果未能解决你的问题,请参考以下文章

会话控制

会话 控制终端 setsid

会话控制

会话控制

Session(会话控制)

4.flash框架-http会话控制(cookie和session)