今天就跟大家聊聊有關(guān)如何使用canvas實現(xiàn)圖形驗證碼,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
作為一家“創(chuàng)意+整合+營銷”的成都網(wǎng)站建設(shè)機構(gòu),我們在業(yè)內(nèi)良好的客戶口碑。創(chuàng)新互聯(lián)提供從前期的網(wǎng)站品牌分析策劃、網(wǎng)站設(shè)計、網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè)、創(chuàng)意表現(xiàn)、網(wǎng)頁制作、系統(tǒng)開發(fā)以及后續(xù)網(wǎng)站營銷運營等一系列服務(wù),幫助企業(yè)打造創(chuàng)新的互聯(lián)網(wǎng)品牌經(jīng)營模式與有效的網(wǎng)絡(luò)營銷方法,創(chuàng)造更大的價值。
細(xì)心的同學(xué)可以發(fā)現(xiàn),現(xiàn)在很多網(wǎng)站當(dāng)?shù)卿浂啻沃缶蜁霈F(xiàn)一個圖形驗證碼,或是當(dāng)提交表單、或點擊獲取手機驗證碼等等場景都會有圖形驗證碼的出現(xiàn)。
那么圖形驗證碼是為了解決什么問題而出現(xiàn)的呢?
圖形驗證碼是驗證碼的一種。驗證碼(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自動區(qū)分計算機和人類的圖靈測試)的縮寫,是一種區(qū)分用戶是計算機還是人的公共全自動程序。可以防止:惡意破解密碼、刷票、論壇灌水,有效防止某個黑客對某一個特定注冊用戶用特定程序暴力破解方式進(jìn)行不斷的登陸嘗試,實際上用驗證碼是現(xiàn)在很多網(wǎng)站通行的方式。
既然圖形驗證碼是為了區(qū)分機器和人之間的操作,那么我們就可以在圖形上繪制一個只有人可以解答的問題。比較常見的是在圖片上生成文字驗證碼,然后用戶輸入圖片上的文字吻合則驗證通過。
雖然這種驗證方法已經(jīng)漸漸的被其他更先進(jìn)的方法所淘汰了(圖片上的文字依然可以被程序識別讀取),并且前端生成驗證碼的方式相較于后端安全性不高,但我們的目的只是為了裝x,提升程序的安全性只是附帶的效果。
首先我們需要在在登錄表單上額外添加用于輸入驗證碼的FormItem,并且給圖形驗證碼提供一個canvas容器。有時候生成的驗證碼看不明白,因此需要給驗證碼添加點擊事件用以切換驗證碼:
<Form ref="loginForm" :model="form" :rules="rules"> <FormItem prop="userName"> <Input v-model="form.userName" placeholder="請輸入用戶名"> <span slot="prepend"> <Icon :size="16" type="person"></Icon> </span> </Input> </FormItem> <FormItem prop="password"> <Input type="password" v-model="form.password" placeholder="請輸入密碼"> <span slot="prepend"> <Icon :size="14" type="locked"></Icon> </span> </Input> </FormItem> <FormItem prop="valiCode" v-show="this.count"> <Input v-model="form.valiCode" placeholder="請輸入驗證碼"> <span slot="prepend"> <Icon :size="14" type="ios-analytics"></Icon> </span> </Input> <div class="canvas" @click="getImgYanzheng"> <canvas id="canvas"></canvas> </div> </FormItem> <FormItem> <Button @click="handleSubmit" type="primary" long>登錄</Button> </FormItem> </Form>
表單需要額外添加valiCode用以記錄用戶輸入的驗證碼。此處我們定義當(dāng)用戶登錄失敗一次則需要額外輸入圖形驗證碼,因此添加count屬性,當(dāng)?shù)顷懯rcount++,當(dāng)然這樣的處理方式并不是很嚴(yán)謹(jǐn),并且用戶刷新頁面count則會清零。可以在此處可以增加更多限制,如異地登錄等,由于本案例完全沒有涉及到后端程序,因此只是簡單的以count為判斷依據(jù)。
data() {
return {
form: {
userName: "",// 用戶名
password: "",// 密碼
valiCode: ""// 驗證碼
},
count: 0, // 登錄次數(shù)
show_num: [],// 圖形上的文字
}
}頁面上為canvas容器綁定的方法getImgYanzheng就是在繪制圖形驗證碼
。在繪制圖形驗證碼時需要為你的驗證碼定義一個內(nèi)容集合,此處使用的是:A,B,C,E,F,G,H,J,K,M,N,P,Q,R,S,T,W,X,Y,Z,1,2,3,4,5,6,7,8,9,0,好,醫(yī),生。字母中剔除了容易誤識別的幾個字母并且可以隨意加入文字(因此圖形驗證碼也可在做成隨機生成四個文字讓用戶點擊,或者生成成語讓用戶填空等等各種形式)。并且忽略用戶大小寫,因此需要用到toLowerCase方法。
接下來就是canvas繪圖的一些技巧了。
canvas 元素本身是沒有繪圖能力的。所有的繪制工作必須在 JavaScript 內(nèi)部完成:
var c=document.getElementById("myCanvas");
var cxt=c.getContext("2d");在JavaScript 中使用 id 來尋找 canvas 元素,然后創(chuàng)建context對象,getContext("2d") 對象是內(nèi)建的 HTML5 對象,擁有多種繪制路徑、矩形、圓形、字符以及添加圖像的方法。我們可以把canvas 想象成景色而context則是景色呈現(xiàn)的畫布。
由于繪制驗證碼的過程中是從左往右繪制的,因此需要規(guī)劃好畫布的使用范圍,另外在驗證碼繪制時還要加上一些隨機的元素使驗證碼不容易被程序識別。
getImgYanzheng() {
var show_num = [];
var canvas_width = 150; //document.getElementById("canvas").style.width;
var canvas_height = 30; //document.getElementById("canvas").style.height;
var canvas = document.getElementById("canvas"); //獲取到canvas的對象,景色
var context = canvas.getContext("2d"); //獲取到canvas畫圖的環(huán)境,景色呈現(xiàn)的畫布
canvas.width = canvas_width;
canvas.height = canvas_height;
var sCode =
"A,B,C,E,F,G,H,J,K,M,N,P,Q,R,S,T,W,X,Y,Z,1,2,3,4,5,6,7,8,9,0,好,醫(yī),生";
var aCode = sCode.split(",");
var aLength = aCode.length; //獲取到數(shù)組的長度
for (var i = 0; i <= 3; i++) {
var j = Math.floor(Math.random() * aLength); //獲取到隨機的索引值
var deg = (Math.random() * 30 * Math.PI) / 180; //產(chǎn)生0~30之間的隨機弧度
var txt = aCode[j]; //得到隨機的一個內(nèi)容
show_num[i] = txt.toLowerCase();
var x = 10 + i * 20; //文字在canvas上的x坐標(biāo)
var y = 20 + Math.random() * 8; //文字在canvas上的y坐標(biāo)
context.font = "bold 23px 微軟雅黑";
context.translate(x, y);
context.rotate(deg);
context.fillStyle = this.randomColor();
context.fillText(txt, 0, 0);
context.rotate(-deg);
context.translate(-x, -y);
}
for (var i = 0; i <= 5; i++) {
//驗證碼上顯示線條
context.strokeStyle = this.randomColor();
context.beginPath();
context.moveTo(
Math.random() * canvas_width,
Math.random() * canvas_height
);
context.lineTo(
Math.random() * canvas_width,
Math.random() * canvas_height
);
context.stroke();
}
for (var i = 0; i <= 30; i++) {
//驗證碼上顯示小點
context.strokeStyle = this.randomColor();
context.beginPath();
var x = Math.random() * canvas_width;
var y = Math.random() * canvas_height;
context.moveTo(x, y);
context.lineTo(x + 1, y + 1);
context.stroke();
}
this.show_num = show_num;
},驗證碼及線條需要一些隨機的顏色:
randomColor() {
//得到隨機的顏色值
var r = Math.floor(Math.random() * 256);
var g = Math.floor(Math.random() * 256);
var b = Math.floor(Math.random() * 256);
return "rgb(" + r + "," + g + "," + b + ")";
}有了以上兩個方法,圖形驗證碼就已經(jīng)生成完畢了,接下來就是使用的問題了。
判斷登錄次數(shù)count,如果登錄次數(shù)大于0則需要輸入驗證碼:
const self = this;
if (this.count) {
if (this.form.valiCode) {
if (this.show_num.join("") != this.form.valiCode.toLowerCase()) {
self.$Notice.warning({
title: "驗證碼錯誤"
});
return;
}
} else {
self.$Notice.warning({
title: "請輸入驗證碼"
});
return;
}
}當(dāng)?shù)卿浭r需要執(zhí)行count++并且刷新驗證碼:
self.count++;
self.getImgYanzheng();
self.$Notice.warning({
title: "登陸失敗",
desc: rs.data.msg
});
看完上述內(nèi)容,你們對如何使用canvas實現(xiàn)圖形驗證碼有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。
本文標(biāo)題:如何使用canvas實現(xiàn)圖形驗證碼
分享鏈接:http://www.yijiale78.com/article34/gjhdse.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站營銷、手機網(wǎng)站建設(shè)、網(wǎng)站設(shè)計公司、網(wǎng)站收錄、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)