最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

焦点速讯:会话控制

来源:博客园

会话控制

1、介绍

所谓会话控制,就是对会话进行控制。


(相关资料图)

HTTP是一种无状态协议,它没有办法区分多次请求是否来自同一个客户端,无法区别用户。

而产品中又大量存在这样的需求,所以我们需要通过会话控制来解决这个问题。

常见的会话控制技术有三种:

  • cookie
  • session
  • token

2、cookie

2.1、cookie是什么?

cookie是HTTP服务器发送到用户浏览器并保存在本地的一小块数据。

cookie是保存在浏览器端的一小块数据。

cookie是按照域名划分保存的。

简单示例:

域名cookie
www.baidu.coma=100;b=200
www.bilibili.comxid=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");});// 获取cookieapp.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";// 校验tokenjwt.verify(token, "chen", (err, data) => {    if (err) {        console.log("校验失败");        return;    }    console.log(data);});app.listen(3000);

关键词: