常用驗證碼之字符串驗證碼

寫在前面

驗證碼 這個玩意忍弛,無論是開發(fā)者還是用戶都十分熟悉:

  • 注冊戒财? 請輸入驗證碼...
  • 登錄咽斧? 請輸入驗證碼...
  • 修改密碼? 請輸入驗證碼...
  • 刪除呼胚? 請輸入驗證碼...
  • ……

總之茄唐,各類敏感操作,請輸入驗證碼蝇更!

check_text.png

這么多場景中用到驗證碼沪编,它到底有什么用呼盆?作為前端開發(fā)者,如何去實現(xiàn)呢漾抬?
接下來步入正題宿亡。

驗證碼

  • 是一種區(qū)分用戶是計算機還是人的公共全自動程序。區(qū)分用戶是真人還是程序纳令,防止程序頻繁訪問服務(wù)器占用過多的資源挽荠。

作用:

  • 防止惡意破解密碼、刷票平绩、論壇灌水等圈匆;
  • 有效防止某個黑客對某一個特定注冊用戶用特定程序暴力破解方式進行不斷的登陸嘗試
  • 敏感操作前的提示
  • 防止惡意注冊

驗證碼表現(xiàn)方式:

  • 隨機字符串驗證碼
  • 算數(shù)驗證碼
  • Gif動畫驗證碼
  • 滑動驗證碼
  • 點選驗證碼
  • 短信驗證碼
  • 手機語音驗證碼

接下來會使用純前端方式實現(xiàn)其中的一些表現(xiàn),如隨機字符串驗證碼捏雌、算數(shù)驗證碼跃赚、滑動驗證碼等。

本篇記錄隨機字符串驗證碼性湿。

隨機字符串驗證碼

一般來講纬傲,字符串、算數(shù)肤频、gif叹括、短信語音等驗證碼放在后端實現(xiàn),但本著技術(shù)無界限的原則宵荒,前端依然是能照葫蘆畫瓢給實現(xiàn)出來的汁雷。
本次要實現(xiàn)的效果如下:

效果

check_text.gif

分析

驗證碼實現(xiàn)步驟:

  • canvas畫布
  • 生成隨機字符串
  • 隨機顏色
  • 背景色(可固定色)
  • 噪音線設(shè)置
  • 繪制驗證碼

其他一些基礎(chǔ)內(nèi)容也包含其中,如點擊驗證碼刷新报咳、點擊下一步驗證等操作侠讯。

步驟實現(xiàn):

注:本案例基于vue操作,UI使用element完成暑刃,原生js同樣道理

1. canvas畫布

html

<!-- 輸入框 -->
<input v-model="inputCode" placeholder="請輸入驗證碼厢漩,不區(qū)分大小寫" />
<!-- canvas畫布:驗證碼 -->
<canvas ref="checkCode" @click="getCode"></canvas>
<!-- 按鈕 -->
<button @click="checkMe">下一步</button>

js

// 需要的數(shù)據(jù)
data() {
    return {
        inputCode: '',  // 輸入的值
        checkCode: '',  // 圖片驗證碼的值
        // canvas各種設(shè)置
        cvs: {
            w: 100, // 給出默認寬度  寬度會在圖片繪制時根據(jù)長度更改
            h: 40,  // 高 與input保持一致
            fontSize: 24,   // 字體大小
            // 字符串生成范圍
            str: '1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPLKJHGFDSAZXCVBNM',  
            len: 4, // 字符串長度 
            line: 3 // 噪音線個數(shù)
        }
    }
}

2. 生成隨機字符串

  • 寫一個隨機整數(shù)生成器,在各個環(huán)節(jié)都會用到
  • 生成隨機字符串岩臣,長度是在data里面cvs中對應(yīng)長度
// 隨機整數(shù)生成器袁翁,范圍[0, max)
rInt(max) {
    return Math.floor(Math.random() * 100000 % max);
},

// 生成隨機字符串
rCode() {
    let code = '';
    let len = this.cvs.len;
    let strLen = this.cvs.str.length;
    for(let i = 0; i < len; i ++) {
        code += this.cvs.str.charAt(this.rInt(strLen));
    }
    this.checkCode = code;
    return code;
},

3. 生成隨機顏色

  • rgba格式
  • a:透明度,取值為0.5-1
 // 生成隨機顏色 rgba格式
rColor() {
    let a = ((Math.random()*5 + 5) / 10).toFixed(2);
    return `rgba(${this.rInt(256)}, ${this.rInt(256)}, ${this.rInt(256)}, ${a})`
},

4. 開始繪制

  • 方法接收一個dom對象
  • 判斷瀏覽器對canvas支持程度
  • 取隨機字符串
  • 設(shè)置canvas寬高大小
  • 繪制

具體過程如下:

// 驗證碼圖片繪制
drawCode(domCvs) {
    let _this = this;
    // 隨機字符串
    let checkCode = this.rCode();
    // 寬設(shè)置
    this.cvs.w = 10 + this.cvs.fontSize * this.cvs.len;

    // 判斷是否支持canvas
    if(domCvs !== null && domCvs.getContext && domCvs.getContext('2d')){
        // 設(shè)置顯示區(qū)域大小
        domCvs.style.width = _this.cvs.w;
        // 設(shè)置畫板寬高
        domCvs.setAttribute('width', _this.cvs.w);
        domCvs.setAttribute('height', _this.cvs.h);
        // 畫筆
        let pen = domCvs.getContext('2d');
        // 背景: 顏色  區(qū)域
        pen.fillStyle = '#eee';
        pen.fillRect(0, 0, _this.cvs.w, _this.cvs.h);
        // 水平線位置
        pen.textBaseline = 'middle';   // top middle bottom
        // 內(nèi)容
        for(let i = 0; i < _this.cvs.len; i ++) {
            pen.fillStyle = _this.rColor(); // 隨機顏色
            pen.font = `bold ${_this.cvs.fontSize}px 微軟雅黑`; // 字體設(shè)置
            // 字符繪制: (字符, X坐標(biāo), Y坐標(biāo))
            pen.fillText(checkCode.charAt(i), 10 + _this.cvs.fontSize * i, 17 + _this.rInt(10));   
        }
        // 噪音線
        for(let i = 0; i < _this.cvs.line; i ++) {
            // 起點
            pen.moveTo(_this.rInt(_this.cvs.w) / 2, _this.rInt(_this.cvs.h));
            // 終點
            pen.lineTo(_this.rInt(_this.cvs.w), _this.rInt(_this.cvs.h));
            // 顏色
            pen.strokeStyle = _this.rColor();
            // 粗細
            pen.lineWidth = '2';
            // 繪制
            pen.stroke();
        }

    } else {
        this.$message.error('不支持驗證碼格式婿脸,請升級或更換瀏覽器重試');
    }
},

5. 綁定canvas的dom元素

html

<canvas class="codeCanvas" ref="checkCode" @click="getCode"></canvas>

js:getCode方法

// vue的話可直接用$refs取值,不用vue的話可綁定id然后通過document處理
let domCvs = this.$refs.checkCode;
this.drawCode(domCvs);

6. 完成~

  • 在頁面初始化的時候柄驻,也來一個驗證碼
  • 點擊下一步狐树, 驗證datainputCodecheckCode的值是否一樣即可。注意鸿脓,要都換成小寫toLowerCase()或者大寫去處理~
// 初始化先搞一個驗證碼~點擊canvas的時候重新執(zhí)行g(shù)etCode()
mounted() {
    // 獲取驗證碼圖
    this.getCode();
}

結(jié)語

搞定抑钟,手工涯曲,最終效果如效果圖所示~
根據(jù)本篇,那算術(shù)驗證碼的效果已然是呼之欲出了……下一篇更新在塔!


qrcode.jpg

關(guān)注微信公眾號【流眸】回復(fù)【20620】獲取本案例源碼喲~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末幻件,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蛔溃,更是在濱河造成了極大的恐慌绰沥,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贺待,死亡現(xiàn)場離奇詭異徽曲,居然都是意外死亡,警方通過查閱死者的電腦和手機麸塞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門秃臣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人哪工,你說我怎么就攤上這事奥此。” “怎么了雁比?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵稚虎,是天一觀的道長。 經(jīng)常有香客問我章贞,道長祥绞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任鸭限,我火速辦了婚禮蜕径,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘败京。我一直安慰自己兜喻,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布赡麦。 她就那樣靜靜地躺著朴皆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪泛粹。 梳的紋絲不亂的頭發(fā)上遂铡,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機與錄音晶姊,去河邊找鬼扒接。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的钾怔。 我是一名探鬼主播碱呼,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼宗侦!你這毒婦竟也來了愚臀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤矾利,失蹤者是張志新(化名)和其女友劉穎姑裂,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體梦皮,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡炭分,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了剑肯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捧毛。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖让网,靈堂內(nèi)的尸體忽然破棺而出呀忧,到底是詐尸還是另有隱情,我是刑警寧澤溃睹,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布顷霹,位于F島的核電站截驮,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鞋仍,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一厂镇、第九天 我趴在偏房一處隱蔽的房頂上張望诀拭。 院中可真熱鬧疫向,春花似錦、人聲如沸商佑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽茶没。三九已至肌幽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間抓半,已是汗流浹背喂急。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留笛求,地道東北人煮岁。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓讥蔽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親画机。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354