egg.js服务端如何将验证码保存在session

发布于 2022-09-11 18:37:07 字数 2304 浏览 17 评论 0

问题:服务端生成验证码,自己将验证码的value到session, 图片验证码给前端,前端点击登录,传递验证码的value到服务器,服务器从session获取到value与前端传进来的value进行比较,实现登录。问题出在 服务器从session无法获取到value,打印出来是undefined

async getCode() {
    const { ctx } = this;
    let codeInfo = svgCaptcha.create({
      width: 120,
      height: 40,
      size: 4, // 验证码长度
      ignoreChars: '012iIlLoOzZ', // 验证码字符中排除 
      noise: 3, // 干扰线条的数量
      color: true, // 验证码的字符是否有颜色,默认没有,如果设定了背景,则默认有
      background: '#d8e3e7', // 验证码图片背景颜色
    });

    ctx.session.login_code = codeInfo.text
    console.log(ctx.session.login_code) // undefined
    console.log(ctx.session) // {}

    ctx.body = {
      success: 1,
      message: '',
      data: {
        data: codeInfo.data
      }
    }
  }
async login() {
    const { ctx, app } = this;

    const { code, type } = ctx.request.body
    const username = ctx.request.body.username
    const password = ctx.request.body.password

    console.log(ctx.session.login_code)

    if (type === 1) {// 表示登录
      if (code === ctx.session.login_code) {
        ctx.body = await ctx.service.user.login(username, password)
      } else {
        ctx.body = {
          success: 0,
          message: "验证码错误",
          ctx: ctx
        }
      }
    }

之后我尝试了两种方法:
一、https://segmentfault.com/q/10...

我也看了这篇文章,解答还是指引去看文档,但是我要做的仅仅是将验证码存在session,之后再取出来,似乎看这个官方文档,没多大作用

二、尝试使用egg-session插件,按照npm上的操作步骤,设置如下:


    // app.js
 
module.exports = app => {
  // set redis session store
  // session store must have 3 methods
  // define sessionStore in `app.js` so you can access `app.redis`
  app.sessionStore = {
    async get(key) {
      const res = await app.redis.get(key);
      if (!res) return null;
      return JSON.parse(res);
    },
 
    async set(key, value, maxAge) {

      if (!maxAge) maxAge = 24 * 60 * 60 * 1000;
      value = JSON.stringify(value);
      await app.redis.set(key, value, 'PX', maxAge);
    },
 
    async destroy(key) {
      await app.redis.del(key);
    },
  };
 
};

但是我在我的getCode函数里面无法使用app.sessionStore.set("login_code", login_code),
就连app.sessionStore都是undefined,难道是我这个sessionStore对象没有挂载到app上面去吗?

请各路大神指点指点

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

不再让梦枯萎 2022-09-18 18:37:09

可以看一下你的项目目录吗 我按照教程使用是没有问题的

乖乖兔^ω^ 2022-09-18 18:37:07

后来修改如下,可以从session获取到之前存储的验证码,好像和前面我的操作没什么区别
如下代码,可以进行session验证码的存储和获取。

'use strict';

const Controller = require('egg').Controller;
const svgCaptcha = require('svg-captcha');
const jwt = require('jsonwebtoken');
const service = require('../service/user')
const qs = require("qs")

class HomeController extends Controller {
  async getCode() {
    const { ctx, app } = this;
    let codeInfo = svgCaptcha.create({
      width: 120,
      height: 40,
      size: 4, // 验证码长度
      ignoreChars: '012iIlLoOzZ', // 验证码字符中排除 
      noise: 3, // 干扰线条的数量
      color: true, // 验证码的字符是否有颜色,默认没有,如果设定了背景,则默认有
      background: '#d8e3e7', // 验证码图片背景颜色
    });
    ctx.session.login_code = codeInfo.text
    ctx.body = {
      success: 1,
      message: '',
      data: {
        data: codeInfo.data,
        text: codeInfo.text
      }
    }
  }

  async login() {
    const { ctx, app } = this;

    const { code, type } = ctx.request.body
    const username = ctx.request.body.username
    const password = ctx.request.body.password
    const validCode = ctx.request.body.validCode

    // function formatCookies(str){
    //   let arr = str.split("; ")
    //   let newObj = {}
    //   arr.forEach(item=>{
    //     let itemArr = item.split("=")
    //     let obj = {}
    //     obj[itemArr[0]] = itemArr[1]
    //     newObj = { ...newObj,...obj}
    //   })
    //   console.log(newObj)
    //   return newObj
    // }

    // let cookies = formatCookies(ctx.request.header.cookie)

    if (code.toLowerCase() === ctx.session.login_code.toLowerCase()) {
      ctx.body = await ctx.service.user.login(username, password)
    } else {
      ctx.status = 400
      ctx.body = {
        success: 0,
        message: "验证码错误",
      }
    }
  }

  async success() {
    this.ctx.body = this.ctx.state.user;
  }
}

module.exports = HomeController;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文