js使用svg-captcha生成图片验证码

nodejs(nestjs)后端开发过程中会有一个需要生成图片验证码的功能,其能减少机器人攻击操作,这也是开发过程中比较常见的功能,这边我们通过 svg-captcha,来实现一个验证码功能,并且小小的优化一下其逻辑

首先导入对应库 svg-captcha

js 复制代码
yarn add svg-captcha

基础使用就这样了,很简单

js 复制代码
var svgCaptcha = require('svg-captcha');

const svg = svgCaptcha.create()
svg.text 文本
svg.data 图片数据
文本保存用于校验,图片数据返回给客户端,让客户端进行对比即可

这个验证码只能生成文本和图片,正常生成代码的时候我们需要给其一个随机验证码,这样我们需要保存文本信息,方便用于校验,甚至传一个自己生成的id当唯一值对比,但仍然会存在一个问题,这个验证码是没有身份信息的,随便一个人访问都要生成一个新的,那么短时间内人过多的话,会生成非常多的验证码(当然我们只保存一个自己生成的id、text正常用肯定没事,过期清理即可)

如果碰到人特别多的情况怎么办,我们直接保存几个验证码文本和图片即可,假设限定数量10个,循环利用,有效期1分钟,过期剔除换新的,用完定期清理即可,优点数量少访问快,缺点就是一段时间内会出现重复的(实际上稍微多增加几个就看不出来了,因为下次是随机的,过期也会换新的,内存峰值最大也就那样了,以假乱真)

ps:开发的世界真真假假谁有分得清呢

js 复制代码
//自己也可以根据需要添加 id 哈,这里就加入id了,只要对一个是对的那么就是对的,自己可以更加严谨点哈
type ImageCodeType = {
    text: string
    image: string
    timeStamp: number
}

private imgCodes: any[] = []
private imgClearTimeout?: NodeJS.Timeout

getVerificationCode() {
    const currentTime = new Date().getTime()
    const newCode: ImageCodeType[] = []
    this.imgCodes.forEach((item) => {
        if (currentTime - item.timeStamp < 60000) {
            newCode.push(item)
        }
    })
    let imgInfo: ImageCodeType
    if (newCode.length < 10) {
        const captchaCode = svgCaptcha.create()
        imgInfo = {
            text: captchaCode.text.toLocaleLowerCase(),
            image: captchaCode.data,
            timeStamp: new Date().getTime(),
        }
        newCode.push(imgInfo)
    } else {
        const index = Math.floor(new Date().getTime() % 10)
        imgInfo = newCode[index]
    }
    this.imgCodes = newCode

    //避免长时间占用内存,2分钟后无人使用清理
    if (this.imgClearTimeout) {
        clearTimeout(this.imgClearTimeout)
    }
    this.imgClearTimeout = setTimeout(() => {
        this.imgCodes.length = 0
        this.imgClearTimeout = void 0
    }, 120000)

    return imgInfo.image
}

校验一下,设置了id就拿到对应的再校验即可,这里就直接满足其中一个即可

js 复制代码
//我们对比一下
const code = params.verification_code.toLocaleLowerCase()
if (!this.img_code.find((e) => e.text === code)) {
    return throw '请输入正确的验证码'
}
相关推荐
濮水大叔2 小时前
在 DTO 中使用 Form Layout 配置复杂表单,支持 Tabs/Groups/Sections
vue.js·typescript·node.js
Starry-sky(jing)2 小时前
如何判断 Windows 是否安装 Node.js:三种方法 + 常见漏判场景
运维·windows·node.js·环境检测
zzx2006__4 小时前
Ajax➕node.js➕webpack
ajax·webpack·node.js
触底反弹13 小时前
🔥 前端也能玩转 AI 流式输出!从二进制流到打字机效果,一篇讲透
javascript·人工智能·node.js
海上彼尚14 小时前
Nodejs也能写Agent - 16.LangGraph篇 - 条件分支与循环
前端·后端·langchain·node.js
Goodbye19 小时前
Node.js `path` 与 `fs` 模块详解——从路径操作到异步流程控制
node.js
Dreamboat-L1 天前
NVM的安装与使用(保姆级教程)
npm·node.js
拾年2751 天前
RAG 灵魂三问:你的文档是怎么"喂"给大模型的?
langchain·node.js·llm
南方程序猴1 天前
Codex CLI + VS Code 组合教程:从 Node.js 安装到接入国内中转站
gpt·ai·chatgpt·node.js·ai编程
先吃饱再说1 天前
后端也能用 jQuery 爬网页?Cheerio 了解一下
爬虫·node.js·jquery