JS使用svg-captcha生成圖片驗證碼的示例代碼
nodejs(nestjs)
后端開發(fā)過程中會有一個需要生成圖片驗證碼的功能,其能減少機器人攻擊操作,這也是開發(fā)過程中比較常見的功能,這邊我們通過 svg-captcha
,來實現(xiàn)一個驗證碼功能,并且小小的優(yōu)化一下其邏輯
首先導入對應庫 svg-captcha
yarn add svg-captcha
基礎使用就這樣了,很簡單
var svgCaptcha = require('svg-captcha'); const svg = svgCaptcha.create() svg.text 文本 svg.data 圖片數(shù)據(jù) 文本保存用于校驗,圖片數(shù)據(jù)返回給客戶端,讓客戶端進行對比即可
這個驗證碼只能生成文本和圖片,正常生成代碼的時候我們需要給其一個隨機驗證碼,這樣我們需要保存文本信息,方便用于校驗,甚至傳一個自己生成的id當唯一值對比,但仍然會存在一個問題,這個驗證碼是沒有身份信息的,隨便一個人訪問都要生成一個新的,那么短時間內人過多的話,會生成非常多的驗證碼(當然我們只保存一個自己生成的id、text正常用肯定沒事,過期清理即可)
如果碰到人特別多的情況怎么辦,我們直接保存幾個驗證碼文本和圖片即可,假設限定數(shù)量10個,循環(huán)利用,有效期1分鐘,過期剔除換新的,用完定期清理即可,優(yōu)點數(shù)量少訪問快,缺點就是一段時間內會出現(xiàn)重復的(實際上稍微多增加幾個就看不出來了,因為下次是隨機的,過期也會換新的,內存峰值最大也就那樣了,以假亂真)
ps
:開發(fā)的世界真真假假誰有分得清呢
//自己也可以根據(jù)需要添加 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圖片驗證碼內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
設置iframe的document.designMode后僅Firefox中其body.innerHTML為br
設置iframe的document.designMode為On可以讓其可編輯,一般用在富文本編輯器組件中。這里僅列出各瀏覽器差異2012-02-02JavaScript代碼輕松實現(xiàn)網(wǎng)頁內容禁止復制(代碼簡單)
有些時候我們寫的內容不想被別人復制,在代碼中怎么實現(xiàn)的呢?下面小編給大家介紹javascript代碼輕松實現(xiàn)網(wǎng)頁內容禁止復制,感興趣的童鞋一起看看吧2015-10-10使用 js 簡單的實現(xiàn) bind、call 、aplly代碼實例
這篇文章主要介紹了使用 js 簡單的實現(xiàn) bind、call 、aplly代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-09-09JavaScript中使用replace結合正則實現(xiàn)replaceAll的效果
JavaScript?中使用?replace?達到?replaceAll的效果,其實就用利用的正則的全局替換。2010-06-06JS對話框_JS模態(tài)對話框showModalDialog用法總結
本篇文章主要是對JS對話框_JS模態(tài)對話框showModalDialog的用法進行了總結介紹,需要的朋友可以過來參考下,希望對大家有所幫助2014-01-01JS實現(xiàn)的數(shù)組去除重復數(shù)據(jù)算法小結
這篇文章主要介紹了JS實現(xiàn)的數(shù)組去除重復數(shù)據(jù)算法,總結分析了4種比較常見的數(shù)組去重復算法及相關使用技巧,需要的朋友可以參考下2017-11-11