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() + ).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() + : 一小时之后的毫秒数 // new Date(Date.now() + ).toUTCString(): 将时间戳转为时间格式(UTC时间格式) let time = new Date(Date.now() + ).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数据
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/hd-nodejs/10828.html