目录
-
因为 http 是一种无状态协议,浏览器请求服务器是无状态的。
-
无状态:指一次用户请求时,浏览器、服务器无法知道之前这个用户做过什么,每次请求都是一次新的请求。
-
无状态原因:浏览器与服务器是使用 socket 套接字进行通信的,服务器将请求结果返回给浏览器之后,会关闭当前的 socket 连接,而且服务器也会在处理页面完毕之后销毁页面对象。
-
有时需要保持下来用户浏览的状态,比如用户是否登录过,浏览过哪些商品等
-
实现状态保持主要有两种方式:
-
在客户端存储信息使用
Cookie
-
在服务器端存储信息使用
Session
-
无状态协议:
协议对于事务处理没有记忆能力
对同一个 url 请求没有上下文关系
每次的请求都是独立的,它的执行情况和结果与前面的请求和之后的请求是无直接关系的,它不会受前面的请求应答情况直接影响,也不会直接影响后面的请求应答情况
服务器中没有保存客户端的状态,客户端必须每次带上自己的状态去请求服务器
人生若只如初见
状态举例:
-
有状态:
-
A:你今天中午吃的啥?
-
B:吃的大盘鸡。
-
A:味道怎么样呀?
-
B:还不错,挺好吃的。
-
-
无状态:
-
A:你今天中午吃的啥?
-
B:吃的大盘鸡。
-
A:味道怎么样呀?
-
B:???啊?啥?啥味道怎么样?
-
-
所以需要cookie这种东西:
-
A:你今天中午吃的啥?
-
B:吃的大盘鸡。
-
A:你今天中午吃的大盘鸡味道怎么样呀?
-
B:还不错,挺好吃的。
-
3.1、cookie
特点:
1、cookie由服务器生成,保存在浏览器端的一小段文本信息
2、cookie是以键和值得形式进行存储
3、浏览器在访问一个网站的服务器时,会自动在请求头中把和本网站相关的所有cookie发送给服务器
4、cookie是基于域名安全的
5、cookie有过期时间,默认关闭浏览器之后过期
使用:
先安装和引入:cookie-parser
注册到app中:
const cookieParase = require('cookie-parser');
app.use(cookieParase());
设置cookie:res.cookie('name', "node", {maxAge: 1000 * 60 * 60 * 2 });
获取cookie:let name = req.cookies["name"]
完整代码如下:
// 1、安装cookie-parser
// 2、引入cookie-parser并注册到app中
const cookieParase = require('cookie-parser');
app.use(cookieParase());
app.get("/setCookie",(req,res)=>{
//设置cookie
res.cookie('name', "node", {maxAge: 1000 * 60 * 60 * 2 }); // 过期时间:单位毫秒
res.cookie('age', 11);
res.send("设置了cookie")
})
app.get("/getCookie",(req,res)=>{
//获取cookie信息
let name = req.cookies["name"];
let age = req.cookies["age"];
res.send(`获取cookie, ${name}, ${age}`);
})
3.2、session
特点:
1、session数据保存在服务器端
2、session是以键和值的形式进行存储
3、session依赖于cookie,每个session信息对应的客户端的标识保存在cookie中
使用:
先安装和引入:cookie-session
const cookieSession = require('cookie-session');
注册到app中:
app.use(cookieSession({
name:"my_session", //name为session名,自己起一个字符串就行
keys:["$^%%&^&%$RT%&TYGSGSFRR554785432$#@$$#%$@#%"], // 内部加密需要的keys, keys为随机字符串
maxAge: 1000 * 60 * 60 * 24 // 过期时间
}))
设置session:req.session["name"] = "session_node"
获取session:let name = req.session["name"]
完整代码如下:
// 1、先安装:yarn add cookie-session
// 如果报错,后面添加版本号,然后一直回车就好 yarn add cookie-session@2.0.0
// 2、设置到app中
const cookieSession = require('cookie-session');
app.use(cookieSession({
name:"my_session", //name为session名,自己起一个字符串就行
keys:["$^%%&^&%$RT%&TYGSGSFRR554785432$#@$$#%$@#%"], // 内部加密需要的keys, keys为随机字符串
maxAge: 1000 * 60 * 60 * 24 // 过期时间
}))
app.get("/setSession",(req,res)=>{
//设置session
req.session["name"] = "session_node"
req.session["age"] = 11
res.send("设置了Session")
})
app.get("/getSession",(req,res)=>{
//获取session信息
let name = req.session["name"]
let age = req.session["age"]
res.send(`获取Session, ${name}, ${age}`);
})