Node学习(九)063-会话技术简介之cookie的设置和获取——会话控制的分类之cookie-保存客户端(浏览器)、session-保存服务器 & cookie的设置与获取 & cookie有效期

Node学习(九)063-会话技术简介之cookie的设置和获取——会话控制的分类之cookie-保存客户端(浏览器)、session-保存服务器 & cookie的设置与获取 & cookie有效期

1. 会话技术概况

1.1 http协议的缺陷

http是无状态的,就是无记忆,不能让同一浏览器和服务器进行多次数据交换时,产生业务的连续性。

目前,每次请求都是独立的,没有关系的。所以服务器和客户端都不知道是否是登录过的。

1.2 什么是会话控制

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

1.3 会话控制的分类

  • cookie: 将数据持久化保存到客户端(浏览器)
  • session: 将数据持久化保存到服务器端

在这里插入图片描述

2. cookie技术

2.1 什么是cookie

  • cookie是将数据持久化存储到客户端的一种技术。

  • 网站可以将数据写到浏览器中, 一个网站最多能在一个浏览器写20个cookie。现在的浏览器能写的更多

  • 一个浏览器能够设置的总cookie数最多为300个,每个不能超过4kb。

  • cookie既能保存在文件中,也能保存在内存中。

  • 可以通过浏览器查看某个网站的cookie

在这里插入图片描述

2.2 设置cookie

  • 核心: cookie是服务端设置的,随着响应头返回给浏览器的信息,浏览器要将这些信息记录下来
  • 如何设置cookie
    • 使用 res.setHeader
    • 使用 res.writeHead
    • 如果使用的是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模块中的writeHead 方法,它不能和sendFile及send一起使用
res.writeHead(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']
})

2.3 读取cookie

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

// 加载express
const express = require('express');
// 创建app对象
const app = express();
// 监听端口,开启服务
app.listen(3000, () => console.log('服务启动了'));

app.get('/test1', (req, res) => {
    
    
    // 设置cookie
    // 这里设置一个变量
    let vcode = '2N9i';
    // res.setHeader('Set-Cookie', 'yzm='+vcode);
    let time = new Date(Date.now() + 60000*2).toUTCString();
    res.set({
    
    
        // 'set-cookie': 'yzm=aaaa'
        'set-cookie': ['age=20;expires=' + time, 'name=zs', 'sex=f']
    });
    res.send('设置成功');
});

app.get('/test2', (req, res) => {
    
    
    // 获取cookie
    // 下面的这个接口能否使用上面接口定义的变量
    console.log(req.headers.cookie);
    res.send('获取成功');
});

app.get('/test3', (req, res) => {
    
    
    // 获取cookie
    // 下面的这个接口能否使用上面接口定义的变量
    console.log(req.headers.cookie);
    res.send('获取成功');
});

2.4 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]
});

cookie实例

1、新建cookie文件夹,并在当前文件夹下安装express包,搭建express服务器

npm i express

2、在cookie文件夹下,新建app.js文件作为服务器

cookie/app.js

简略版

// 加载express
const express = require('express');
// 创建app对象
const app = express();
// 监听端口,开启服务
app.listen(3000, () => console.log('服务启动了'));

详细版

// 加载express
const express = require('express');
// 创建app对象
const app = express();
// 监听端口,开启服务
app.listen(3000, () => console.log('服务启动了'));

app.get('/test1', (req, res) => {
    
    
    // 设置cookie
    // 这里设置一个变量
    let vcode = '2N9i';
    // res.setHeader('Set-Cookie', 'yzm='+vcode);
    let time = new Date(Date.now() + 60000*2).toUTCString();// 设置cookie有效时间
    res.set({
    
    
        // 'set-cookie': 'yzm=aaaa'
        'set-cookie': ['age=20;expires=' + time, 'name=zs', 'sex=f']
    });
    res.send('设置成功');
});

app.get('/test2', (req, res) => {
    
    
    // 获取cookie
    // 下面的这个接口能否使用上面接口定义的变量
    console.log(req.headers.cookie);
    res.send('获取成功');
});

app.get('/test3', (req, res) => {
    
    
    // 获取cookie
    // 下面的这个接口能否使用上面接口定义的变量
    console.log(req.headers.cookie);
    res.send('获取成功');
});

3、在cookie文件夹下,执行命令,启动服务

nodemon ./app.js
#或者
node ./app.js

服务启动效果

在这里插入图片描述

页面验证效果——test1设置成功、test2获取成功

在这里插入图片描述

test2获取cookie

在这里插入图片描述

获取设置的cookie

在这里插入图片描述

注:

如果关闭浏览器,重新在浏览器中输入127.0.0.1:3000/test2,虽然显示获取成功,但无法获取到cookie

1

在这里插入图片描述

2

在这里插入图片描述

浏览器中输入127.0.0.1:3000/test3,node控制台可以打印到test3数据

在这里插入图片描述

test3页面示意流程

在这里插入图片描述

cookie查看效果

在这里插入图片描述

设置cookie有效时间

在这里插入图片描述
注:设置了cookie有效期后,关闭浏览器后,输入地址,也可以继续拿到cookie数据

猜你喜欢

转载自blog.csdn.net/weixin_44867717/article/details/129807615
今日推荐