JS使用svg-captcha生成图片验证码的示例代码

 更新时间:2024年06月16日 08:42:14   作者:剪刀石头布啊  
nodejs(nestjs)后端开发过程中会有一个需要生成图片验证码的功能,其能减少机器人攻击操作,本文我们通过 svg-captcha,来实现一个验证码功能,并且小小的优化一下其逻辑,需要的朋友可以参考下

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

首先导入对应库 svg-captcha

yarn add svg-captcha

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

var svgCaptcha = require('svg-captcha');

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

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

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

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

//自己也可以根据需要添加 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就拿到对应的再校验即可,这里就直接满足其中一个即可

//我们对比一下
const code = params.verification_code.toLocaleLowerCase()
if (!this.img_code.find((e) => e.text === code)) {
    return throw '请输入正确的验证码'
}

到此这篇关于JS使用svg-captcha生成图片验证码的示例代码的文章就介绍到这了,更多相关JS svg-captcha图片验证码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解读函数的节流与防抖问题

    解读函数的节流与防抖问题

    这篇文章主要介绍了解读函数的节流与防抖问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • 详解javascript 变量提升(Hoisting)

    详解javascript 变量提升(Hoisting)

    这篇文章主要介绍了详解javascript 变量提升(Hoisting),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • javascript实现拍照功能详细示例代码

    javascript实现拍照功能详细示例代码

    这篇文章主要给大家介绍了关于javascript实现拍照功能的相关资料, 最近做项目,遇到一个正常但又少见的需求之拍照,文中给出了详细的代码示例,需要的朋友可以参考下
    2023-07-07
  • Node.js:Windows7下搭建的Node.js服务(来玩玩服务器端的javascript吧,这可不是前端js插件)

    Node.js:Windows7下搭建的Node.js服务(来玩玩服务器端的javascript吧,这可不是前端js插件

    什么是Node.js?还服务器端javascript?对于这个概念我在这篇文章不做解释,可以自己去搜索了解下,服务器端js不是新技术,只是最近的node.js的火爆让他爆发了,我会在以后的文章里解释什么是node.js。
    2011-06-06
  • 限时抢购-倒计时的完整实例(分享)

    限时抢购-倒计时的完整实例(分享)

    下面小编就为大家带来一篇限时抢购-倒计时的完整实例(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • elementui上传图片回显功能实现

    elementui上传图片回显功能实现

    这篇文章主要介绍了elementui上传图片回显,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • JS+CSS实现分类动态选择及移动功能效果代码

    JS+CSS实现分类动态选择及移动功能效果代码

    这篇文章主要介绍了JS+CSS实现分类动态选择及移动功能效果代码,涉及JavaScript实现页面元素动态变换效果实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • JavaScript中如何调用Java方法

    JavaScript中如何调用Java方法

    这篇文章主要介绍了JavaScript中如何调用Java方法,帮助大家更好的理解和使用JavaScript,感兴趣的朋友可以了解下
    2020-09-09
  • 关于TypeScript开发的6六个实用小技巧分享

    关于TypeScript开发的6六个实用小技巧分享

    TypeScript是Javascrip t超集,支持静态类型检测,可以在编译期提前暴露问题,节省debug时间,下面这篇文章主要给大家介绍了关于TypeScript开发的6六个实用小技巧,需要的朋友可以参考下
    2021-09-09
  • 微信小程序开发指南之图片压缩解决方案

    微信小程序开发指南之图片压缩解决方案

    在项目开发过程中遇到一个需要从小程序上传图片的需求,此需求实现起来并不难,下面这篇文章主要给大家介绍了关于微信小程序开发指南之图片压缩解决方案的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08

最新评论