• session认证


    目录

    前言

    http协议的无状态性

    session的工作原理

    在express中使用session认证

    在session中存数据

    在session中取数据

    清空session

    结尾


    前言

    session是一种记录客户状态的机制,客户端浏览器法访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,这就是session

    http协议的无状态性

    服务器不会主动保留每次http请求的状态

    session的工作原理

    当浏览器向服务器提交账号和密码时,服务器开始验证账号密码。登录成功后的用户信息存储在服务器的内存中,生成对应的cookie字符串,然后服务器响应将生成的cookie发送给客户端浏览器。浏览器自动把cookie存储在当前的域名下。当浏览器再次发起请求时,会将当前域名下的所有可用的cookie发送给服务器。服务器根据请求头中携带的cookie从内存中查找对应信息,身份认证成功,针对当前用户生成特定的响应内容,将对应的页面内容响应给浏览器

    在express中使用session认证

    安装

    npm i express-session

    配置中间件

    1. app.use(session({
    2. secret:'keyboard cat',
    3. resave:'false',
    4. saveUninitialized:true
    5. }))
    在session中存数据
    1. app.use('/post',(req,res)=>{
    2. if(req.body.username !=='admin'|| req.body.password !=='000000'){
    3. return res.send({ status: 1, msg: '登录失败' })
    4. }
    5. req.session.user = req.body
    6. req.session.islogin = true
    7. res.send({ status: 0, msg: '登录成功' })
    8. })

    在这里我们指定账号和密码,使用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请求代码

    1. const express = require('express')
    2. const app = express()
    3. // 导入
    4. const session = require('express-session')
    5. // 配置中间件
    6. app.use(session({
    7. secret:'keyboard cat',
    8. resave:'false',
    9. saveUninitialized:true
    10. }))
    11. // 解析post提交的表单数据
    12. app.use(express.urlencoded({extended:false}))
    13. // post请求
    14. app.use('/post',(req,res)=>{
    15. if(req.body.username !=='admin'|| req.body.password !=='000000'){
    16. return res.send({ status: 1, msg: '登录失败' })
    17. }
    18. req.session.user = req.body
    19. req.session.islogin = true
    20. res.send({ status: 0, msg: '登录成功' })
    21. })
    22. app.listen(80,() => {
    23. console.log('server running the localhost http://127.0.0.1')
    24. })

    这里我们使用postman模拟发起请求,当账户密码输入正确时

    账号密码输入错误时

    由此得出代码正确,可以正确在session中存数据

    在session中取数据

    获取用户名

    1. // get请求获取用户名接口
    2. app.use('/get',(req,res)=> {
    3. if(!req.session.islogin){
    4. return res.send({ status: 1,msg:'fail'})
    5. }
    6. res.send({
    7. status:0,
    8. msg:'success',
    9. username:req.session.user.username
    10. })
    11. })

    使用postman模拟get请求

    成功获取到了登录时的用户名

    清空session

    这里调用req.session.destroy()清空session

     req.session.destroy()

    完整退出登录代码

    1. // 退出登录接口
    2. app.use('/logout',(req,res)=> {
    3. req.session.destroy()
    4. res.send({
    5. status:0,
    6. msg:'退出登陆成功'
    7. })
    8. })

    使用postman模拟调用退出登录api接口

    由图看出已经成功退出了登录状态,并且清空了session

    结尾

    由此session认证就介绍完了,而session认证最大的问题就是有跨域问题,想实现跨域需要很麻烦的配置,所以存在跨域问题时,不建议使用session,推荐使用JWT(jsonwebtoken)。下篇文章将会介绍JWT认证。感谢观看

  • 相关阅读:
    求解幂集问题、简单0/1背包问题
    先进制造aps专题九 中国aps行业分析
    【SemiDrive源码分析】【驱动BringUp】42 - Mailbox Demo实现
    C++中带默认值的函数参数
    华为无线设备配置WMM和优先级映射
    Sqoop实操案例-互联网招聘数据迁移
    【2023秋招面经】4399 前端 二面-hr面(20min)
    MySQL数据库——视图-检查选项(cascaded、local)
    【Leetcode】204. 计数质数
    微信小程序SDK使用实例
  • 原文地址:https://blog.csdn.net/weixin_68854196/article/details/133874629