目录
session是一种记录客户状态的机制,客户端浏览器法访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,这就是session
服务器不会主动保留每次http请求的状态
当浏览器向服务器提交账号和密码时,服务器开始验证账号密码。登录成功后的用户信息存储在服务器的内存中,生成对应的cookie字符串,然后服务器响应将生成的cookie发送给客户端浏览器。浏览器自动把cookie存储在当前的域名下。当浏览器再次发起请求时,会将当前域名下的所有可用的cookie发送给服务器。服务器根据请求头中携带的cookie从内存中查找对应信息,身份认证成功,针对当前用户生成特定的响应内容,将对应的页面内容响应给浏览器
安装
npm i express-session
配置中间件
- app.use(session({
- secret:'keyboard cat',
- resave:'false',
- saveUninitialized:true
- }))
- app.use('/post',(req,res)=>{
- if(req.body.username !=='admin'|| req.body.password !=='000000'){
- return res.send({ status: 1, msg: '登录失败' })
- }
- req.session.user = req.body
- req.session.islogin = true
- res.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.body
- req.session.islogin = true
- res.send({ status: 0, msg: '登录成功' })
- })
-
- app.listen(80,() => {
- console.log('server running the localhost http://127.0.0.1')
- })
这里我们使用postman模拟发起请求,当账户密码输入正确时
账号密码输入错误时
由此得出代码正确,可以正确在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请求
成功获取到了登录时的用户名
这里调用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认证。感谢观看