JS使用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图片验证码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
设置iframe的document.designMode后仅Firefox中其body.innerHTML为br
设置iframe的document.designMode为On可以让其可编辑,一般用在富文本编辑器组件中。这里仅列出各浏览器差异2012-02-02
JavaScript代码轻松实现网页内容禁止复制(代码简单)
有些时候我们写的内容不想被别人复制,在代码中怎么实现的呢?下面小编给大家介绍javascript代码轻松实现网页内容禁止复制,感兴趣的童鞋一起看看吧2015-10-10
使用 js 简单的实现 bind、call 、aplly代码实例
这篇文章主要介绍了使用 js 简单的实现 bind、call 、aplly代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2019-09-09
JavaScript中使用replace结合正则实现replaceAll的效果
JavaScript 中使用 replace 达到 replaceAll的效果,其实就用利用的正则的全局替换。2010-06-06
JS对话框_JS模态对话框showModalDialog用法总结
本篇文章主要是对JS对话框_JS模态对话框showModalDialog的用法进行了总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助2014-01-01


最新评论