nodejs学习--08

34 篇文章 0 订阅
3 篇文章 0 订阅

会话技术概况

http协议的缺陷

http是无状态的,就是无记忆,不能让同一浏览器和服务器进行多次数据交换时,产生业务的连续性。
目前,每次请求都是独立的,没有关系的。所以服务器和客户端都不知道是否是登录过的。

什么是会话控制

会话控制就是解决http无记忆的缺陷的。能够将数据持久化的保存在客户端(浏览器)或者服务器端,从而让浏览器和服务器进行多次数据交换时,产生连续性。

会话控制的分类
  • cookie: 将数据持久化保存到客户端(浏览器)
  • session: 将数据持久化保存到服务器端
cookie技术
  • cookie是将数据持久化存储到客户端的一种技术。
  • 网站可以将数据写到浏览器中, 一个网站最多能在一个浏览器写20个cookie。现在的浏览器能写的更多
  • 一个浏览器能够设置的总cookie数最多为300个,每个不能超过4kb。
  • cookie既能保存在文件中,也能保存在内存中。
  • 可以通过浏览器查看某个网站的cookie
    在这里插入图片描述
设置cookie
  • 核心: cookie是服务端设置的,随着响应头返回给浏览器的信息,浏览器要将这些信息记录下来
  • 如何设置cookie
    • 使用 res.setHeader
    • 使用res.writeHeader
    • 如果使用的是express框架,可以使用res.set()方法
  • cookie设置格式:key=value;expires=time
    • key: cookie的名称
    • value: 名称对应的值
    • expires: 有效期
// 所有的设置cookie,都必须写到一个请求中

//1. 使用 http模块中的setHeader 方法,它可以和sendFile一起使用
res.setHeader('set-cookie', 'id=101');                   //设置单个cookie
res.setHeader('set-cookie', ['id=101', 'name=zs']);      //设置多个cookie

//2. 使用 http模块中的writeHeader 方法,它不能和sendFile一起使用
res.writeHeader(200, {
    'content-type': 'text/html;charset=utf-8',
    'set-cookie': ['type=10', 'name=my']
})//3. 使用 express模块中的set 方法,该方法是express封装的方法,它可以和sendFile一起使用
res.set({'set-cookie':['goodsName=xiaomi 6', 'goodsPrice=3999']})//4. 设置cookie时,指定有效期
//注意:要使用UTC时间,使用 toUTCString()方法转换
//设置有效期为 1小时
const expiresTime = new Date(Date.now() + 3600000).toUTCString();
res.set({'set-cookie':['goodsName=xiaomi 6;expires=' + expiresTime, 'goodsPrice=3999']})

读取cookie
一旦网站在浏览器设置好cookie之后,浏览器再访问网站(任何页面)时,浏览器会将cookie信息随着请求头一起发送给服务器。所以我们在服务器端通过 req.headers.cookie 可以获取到cookie的信息。

cookie有效期

  • 默认情况是,当关闭浏览器,cookie即消失
  • 如果设置了cookie的有效期(expires),则cookie会在指定的有效期内一直存在,无论浏览器是否关闭
// 设置cookie的有效期为1小时
// 方式: 先找到一小时之后的时间戳,再转为utc时间
// Date.now(): 获取当前时间点的时间戳 (毫秒数)
// Date.now() + 3600000: 一小时之后的毫秒数
// new Date(Date.now() + 3600000).toUTCString(): 将时间戳转为时间格式(UTC时间格式)
let time = new Date(Date.now() + 3600000).toUTCString();
// 设置cookie,有效期为1个小时
res.set({
    'set-cookie': ['name=zs;expires='+time]
});
session技术
  • 因为cookie是保存在客户端的数据,不够安全,所以出现了session。
  • session会将数据保存到服务器端(保存在文件、内存服务器或数据表中),安全性就可以得到保证。

设置/读取session
express设置session时,需要使用第三方模块 — express-session

npm i express-session

使用步骤:

  1. 加载 express-session 模块
  2. 将session注册为中间件(这样,当有请求过来的时候,都会先经过中间件)
  3. 使用 req.session 对象设置/读取session
//1. 加载 express-session 模块
const session = require('express-session');
//2. 配置项
let conf = {
    secret: '4ey32erfyf3fgpg',   //加密字符串。 使用该字符串来加密session数据,自定义
    resave: false,               //强制保存session即使它并没有变化
    saveUninitialized: false     //强制将未初始化的session存储。当新建了一个session且未
    							 //设定属性或值时,它就处于未初始化状态。
};
//3. 注册为express-session中间件
app.use(session(conf));

//4. 在一个测试请求中,设置session 
// 方法:  req.session.属性 = 值
app.get('/sets', (req, res) => {
    // session的值可以是任何的数据类型,比如布尔,数组,对象等
    req.session.isLogin = true;
    req.session.userInfo = {user_id:10001, user_name:"zs"};
    //注意:一定要将数据发回给浏览器,否则session无法生效
    res.send('设置session');
});

//设置好之后,req.session中的结构如下,当再次向服务器上任何页面或接口发请求时,我们可以获取到刚刚设置的session值
// req.session = {
//    isLogin: true,
//    userInfo: {user_id:10001, user_name:"zs"}
//}

session有效期

  • 当浏览器关闭后,session消失
  • express-session会将session保存在内存中,每次重启服务器时即使没有关闭浏览器session也会消失

删除session

核心: req.session.destroy() 销毁所有session

// 删除所有session
req.session.destroy();

session 的有效范围
在一个网站中设置了session,则整个网站都能找到这个session

cookie、session原理
cookie原理:
在这里插入图片描述
session原理:
服务器端会为每个用户各自保存一个session(文件)
下次用户再来访问的时候,就不能确定该用户的session是哪一个了
所以当服务器保存session之后,会以cookie的形式告诉浏览器,你的session是哪一个
下次再来访问服务器的时候,浏览器就会带着它自己的session号去访问,服务器就可以找到对应的session了
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值