session --中间件
session的简介
session是另一种记录客户状态的机制,与cookie不同的是 session数据保存在服务器中,而不是保存在客户端浏览器中
session的用途
- session运行在服务器端,当客户端第一次访问服务器时,可以将客户的登录信息保存在服务器端。
- 当用户访问站点的其他页面时,可以根据用户的登录状态做出相应的提示,身份验证拦截。
- session可以和数据库结合做持久化操作,当服务器挂掉时,不会导致用户信息丢失。、
session的工作流程
(例子:商场自助存包)
- 当客户端第一次请求服务器时,服务器会为每个客户端创建一个独享的session对象,用于跟踪用户的状态。
- 同时,为session对象分配一个唯一标识sessionId。
- 为了管理session对象,以sessionId为键,以session对象为值,封装成Map集合。
- 响应客户端时,将sessionId以cookie的形式发送给客户端,存放在客户端浏览器的缓存中。
- 当客户端再次请求服务器时,会将sessionId以cookie请求头的方式发送给服务器,服务器得到sessionId后,从Map集合中,得到session对象,从而跟踪状态
session的特点
- 同源的页面之间可以共享session数据
- 浏览器关闭时,服务器中保存的session对象也会跟着销毁
- 在第一次调用request.getSession()方法时,创建出session,
- 超时:session超过一定时间(默认30分钟,这个时间可设置)没有人使用,则认为超时,干掉这个session。
- 自杀:也可以明确的调用session的invalidate()方法,手动的杀死session。
- 意外身亡:或者当服务器非正常关闭时,服务器中的session跟着消亡。
session的基本使用
1、安装express-sesssion
npm install express-session --save-prod
2、导入
const session = require('express-session');
3、配置中间件
1 // 配置中间件 2 app.use(session({ 3 secret: 'keyboard cat', 4 resave: false, 5 saveUninitialized: true, 6 // cookie: { secure: true } // https 协议的请求才会传入 cookie 7 8 }))
4、设置session数据
1 app.get('/login', (req, res) => { 2 3 req.session.userinfo = 'zhangsan'; 4 res.send('登录成功'); 5 })
5、获取session数据
1 app.get('/', (req, res) => { 2 if (req.session.userinfo) { 3 res.send('欢迎回来' + req.session.userinfo) 4 } else { 5 res.send('未登录') 6 } 7 })
案例:
1 // 导入express 2 const express = require('express'); 3 // 导入session中间件 4 const session = require('express-session'); 5 const app = express(); 6 7 app.use(session({secret:'123',resave:false,name:'heihie', 8 saveUninitialized:true 9 })) 10 // 主页 11 app.get('/',(req,res)=>{ 12 // console.log(req.session) 13 if(req.session.uname){ 14 res.send('欢迎回来'+req.session.uname) 15 }else{ 16 res.send('你还未登录') 17 } 18 }) 19 // 登录 20 app.get('/doLogin',(req,res)=>{ 21 //用户名和密码正确正确 22 if(req.query.username=='zzj'&& req.query.password=="0803"){ 23 // 将用户信息保存到session中 24 req.session.uname=req.query.username; 25 // req.session.password=req.query.password; 26 res.send('登录成功') 27 } 28 }) 29 // 启动服务器并监听端口 30 app.listen(3000,()=>{ 31 console.log('serve running at http://localhost:3000') 32 })
session的配置参数
参数 |
说明 |
secret |
字符串,作为服务端生成session的签名 |
name |
返回客户端的cookie的名称,默认为content.sid,也可以自己设置 |
resave |
强制重新保存session,即使它没有变化,默认为true,建议设置成false |
saveUninitialized |
强制将未初始化的session存储,默认是true,建议设置成true |
cookie |
关于cookie配置信息 |
rolling |
在每次请求时强行设置cookie,这将重置cookie过期时间,默认值为false |