目录
前言
http协议的无状态性
session的工作原理
在express中使用session认证
在session中存数据
在session中取数据
清空session
结尾
前言
session是一种记录客户状态的机制,客户端浏览器法访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,这就是session
http协议的无状态性
服务器不会主动保留每次http请求的状态
session的工作原理
当浏览器向服务器提交账号和密码时,服务器开始验证账号密码。登录成功后的用户信息存储在服务器的内存中,生成对应的cookie字符串,然后服务器响应将生成的cookie发送给客户端浏览器。浏览器自动把cookie存储在当前的域名下。当浏览器再次发起请求时,会将当前域名下的所有可用的cookie发送给服务器。服务器根据请求头中携带的cookie从内存中查找对应信息,身份认证成功,针对当前用户生成特定的响应内容,将对应的页面内容响应给浏览器
在express中使用session认证
安装
npm i express-session
配置中间件
app.use(session({secret:'keyboard cat',resave:'false',saveUninitialized:true
}))
在session中存数据
app.use('/post',(req,res)=>{if(req.body.username !=='admin'|| req.body.password !=='000000'){return res.send({ status: 1, msg: '登录失败' })}req.session.user = req.bodyreq.session.islogin = trueres.send({ status: 0, msg: '登录成功' })
})
在这里我们指定账号和密码,使用req.session.user=req.body将用户信息存储到session中,使用req.session.islogin=true来将用户登录状态存储到session中(注意,必须导入了express-session才能调用req.session,且req.body需要使用中间件来解析post提交的表单数据
app.use(express.urlencoded({extended:false}))
)
完整的post请求代码
const express = require('express')const app = express()
// 导入
const session = require('express-session')// 配置中间件
app.use(session({secret:'keyboard cat',resave:'false',saveUninitialized:true
}))
// 解析post提交的表单数据
app.use(express.urlencoded({extended:false}))// post请求
app.use('/post',(req,res)=>{if(req.body.username !=='admin'|| req.body.password !=='000000'){return res.send({ status: 1, msg: '登录失败' })}req.session.user = req.bodyreq.session.islogin = trueres.send({ status: 0, msg: '登录成功' })
})app.listen(80,() => {console.log('server running the localhost http://127.0.0.1')
})
这里我们使用postman模拟发起请求,当账户密码输入正确时
账号密码输入错误时
由此得出代码正确,可以正确在session中存数据
在session中取数据
获取用户名
// get请求获取用户名接口
app.use('/get',(req,res)=> {if(!req.session.islogin){return res.send({ status: 1,msg:'fail'})}res.send({status:0,msg:'success',username:req.session.user.username})
})
使用postman模拟get请求
成功获取到了登录时的用户名
清空session
这里调用req.session.destroy()清空session
req.session.destroy()
完整退出登录代码
// 退出登录接口
app.use('/logout',(req,res)=> {req.session.destroy()res.send({status:0,msg:'退出登陆成功'})
})
使用postman模拟调用退出登录api接口
由图看出已经成功退出了登录状态,并且清空了session
结尾
由此session认证就介绍完了,而session认证最大的问题就是有跨域问题,想实现跨域需要很麻烦的配置,所以存在跨域问题时,不建议使用session,推荐使用JWT(jsonwebtoken)。下篇文章将会介绍JWT认证。感谢观看