Spring Cloud和Vue中實現圖片文字點擊驗證驗證碼的功能,你需要考慮以下幾個步驟:
以下是一個簡單的示例:
首先,你需要在Spring Cloud中創建一個服務來生成驗證碼圖片。你可以使用Spring Cloud OpenFeign來調用這個服務。
@Service
public class CaptchaService {
@Autowired
private CaptchaGenerator captchaGenerator;
public String generateCaptcha() {
String captcha = captchaGenerator.generateCaptcha();
// 存儲 captcha 到緩存或數據庫,以便后續驗證
return captcha;
}
}
@RestController
@RequestMapping("/api/captcha")
public class CaptchaController {
@Autowired
private CaptchaService captchaService;
@GetMapping("/image")
public ResponseEntity<byte[]> getCaptchaImage() {
String captcha = captchaService.generateCaptcha();
// 生成圖片并返回
// ...
}
}
在Vue中,你可以使用HTML5的canvas標簽來展示圖片,并監聽點擊事件。當用戶點擊圖片上的文字時,你可以通過Ajax請求后端驗證用戶輸入的驗證碼是否正確。
在你的Vue組件中,你可以添加一個方法來生成和驗證驗證碼。這里是一個簡單的示例:
心的同學可以發現,現在很多網站當登錄多次之后就會出現一個圖形驗證碼,或是當提交表單、或點擊獲取手機驗證碼等等場景都會有圖形驗證碼的出現。
那么圖形驗證碼是為了解決什么問題而出現的呢?
圖形驗證碼是驗證碼的一種。驗證碼(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自動區分計算機和人類的https://www.baidu.com/s?wd=圖靈測試&tn=SE_PcZhidaonwhc_ngpagmjz&rsv_dl=gh_pc_zhidao)的縮寫,是一種區分用戶是計算機還是人的公共全自動程序。可以防止:惡意破解密碼、刷票、論壇灌水,有效防止某個黑客對某一個特定注冊用戶用特定程序暴力破解方式進行不斷的登陸嘗試,實際上用驗證碼是現在很多網站通行的方式。
既然圖形驗證碼是為了區分機器和人之間的操作,那么我們就可以在圖形上繪制一個只有人可以解答的問題。比較常見的是在圖片上生成文字驗證碼,然后用戶輸入圖片上的文字吻合則驗證通過。
雖然這種驗證方法已經漸漸的被其他更先進的方法所淘汰了(圖片上的文字依然可以被程序識別讀取),并且前端生成驗證碼的方式相較于后端安全性不高,但我們的目的只是為了裝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用以記錄用戶輸入的驗證碼。此處我們定義當用戶登錄失敗一次則需要額外輸入圖形驗證碼,因此添加count屬性,當登陸失敗時count++,當然這樣的處理方式并不是很嚴謹,并且用戶刷新頁面count則會清零。可以在此處可以增加更多限制,如異地登錄等,由于本案例完全沒有涉及到后端程序,因此只是簡單的以count為判斷依據。
data() { return { form: { userName: "",// 用戶名 password: "",// 密碼 valiCode: ""http:// 驗證碼 }, count: 0, // 登錄次數 show_num: [],// 圖形上的文字 } }
頁面上為canvas容器綁定的方法getImgYanzheng就是在繪制圖形驗證碼
。在繪制圖形驗證碼時需要為你的驗證碼定義一個內容集合,此處使用的是: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,好,醫,生。字母中剔除了容易誤識別的幾個字母并且可以隨意加入文字(因此圖形驗證碼也可在做成隨機生成四個文字讓用戶點擊,或者生成成語讓用戶填空等等各種形式)。并且忽略用戶大小寫,因此需要用到toLowerCase方法。
接下來就是canvas繪圖的一些技巧了。
canvas繪圖
canvas 元素本身是沒有繪圖能力的。所有的繪制工作必須在 JavaScript 內部完成:
var c=document.getElementById("myCanvas"); var cxt=c.getContext("2d");
在JavaScript 中使用 id 來尋找 canvas 元素,然后創建context對象,getContext("2d") 對象是內建的 HTML5 對象,擁有多種繪制路徑、矩形、圓形、字符以及添加圖像的方法。我們可以把canvas 想象成景色而context則是景色呈現的畫布。
由于繪制驗證碼的過程中是從左往右繪制的,因此需要規劃好畫布的使用范圍,另外在驗證碼繪制時還要加上一些隨機的元素使驗證碼不容易被程序識別。
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畫圖的環境,景色呈現的畫布 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,好,醫,生"; var aCode = sCode.split(","); var aLength = aCode.length; //獲取到數組的長度 for (var i = 0; i <= 3; i++) { var j = Math.floor(Math.random() * aLength); //獲取到隨機的索引值 var deg = (Math.random() * 30 * Math.PI) / 180; //產生0~30之間的隨機弧度 var txt = aCode[j]; //得到隨機的一個內容 show_num[i] = txt.toLowerCase(); var x = 10 + i * 20; //文字在canvas上的x坐標 var y = 20 + Math.random() * 8; //文字在canvas上的y坐標 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 + ")"; }
有了以上兩個方法,圖形驗證碼就已經生成完畢了,接下來就是使用的問題了。
判斷登錄次數count,如果登錄次數大于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; } }
當登錄失敗時需要執行count++并且刷新驗證碼:
self.count++; self.getImgYanzheng(); self.$Notice.warning({ title: "登陸失敗", desc: rs.data.msg });
此時就完成了一個圖形驗證碼的添加工作,同學們快裝起來吧。
轉評贊就是最大的鼓勵
登錄網站時往往會需要輸入一些亂七八糟甚至難以辨別的驗證碼以便證明用戶是個真實的個人。更糟糕的是,電腦前的你即便試了多次也難以成功。這一問題在今后將不再出現。由創業團隊火柴棍工作室研發的“火柴手寫碼”能抵御插件工具的破解難度,并且同時保證驗證碼圖片的清晰。
火柴手寫碼,是由一群80/90后碼農,在飽受驗證碼開發之苦后研發出來的。其前端操作過程同一般的驗證碼輸入方式無異。最大不同在于后臺技術——它將海量手寫圖片資源進行碎片化處理,隨機組合、加密生成圖片驗證碼,能使現有OCR技術很難識別,更加安全可靠。這對主要通過服務器自動識別驗證碼的木馬軟件來說,會起到遏制作用。那么手寫驗證碼的原理是什么?它又有哪些獨特之處呢?針對這些問題,CSDN采訪了火柴手寫碼的項目負責人葛付榮。
CSDN:請介紹一下你和你的團隊。
葛付榮:我們的團隊是由一群開發經驗豐富的80/90后碼農組成。此前我們主要從事游戲平臺和辦公平臺的開發工作,曾推出過手機助手、積分平臺等相關產品,對廠商和用戶都有接觸與了解。
CSDN:開發手寫驗證碼是出于什么樣的契機?
葛付榮:驗證碼是開發者與使用者都會被困擾的一個問題,并且目前還沒有一種最好的解決辦法出現。為了尋找用戶體驗與系統安全間的平衡點,我們曾經不斷推出各種驗證碼,直至2014年11月一次偶然的機會,我們掌握了海量手寫字符的生產方法之后,決定將手寫字符與驗證碼技術結合起來并嘗試推出火柴手寫碼。火柴手寫碼是一種清晰、安全、方便的云驗證碼服務。
CSDN:火柴手寫碼與一般驗證碼有什么不同?
葛付榮:火柴手寫碼旨在基于海量手寫字符與復雜安全技術,為開發者構建云驗證碼開放平臺。其前端操作過程同一般的驗證碼輸入方式無異。最大的不同在于后臺技術——火柴手寫碼是將海量手寫圖片資源進行碎片化處理,隨機組合、加密生成圖片驗證碼,能使現有OCR技術很難識別,更加安全可靠。這對主要通過服務器自動識別驗證碼的木馬軟件來說會起到遏制作用。
火柴手寫碼最大特點是它所采用的手寫字符。手寫字符的識別工作在OCR領域一直是個難題,目前尚沒有高效、低成本的解決方案。因為即便同一個人,在不同時間、不同場景下書寫同一個字符,由于書寫時的方式、筆、紙張、環境等因素的不同,都可能導致書寫結果的不一致。當然,光有原始素材是遠遠不夠的。火柴手寫碼還需經過過濾、切割、降噪、再組合等過程,才最終形成用戶所看到的驗證碼。而在這一復雜過程中,我們最終得到的是肉眼更易識別,但OCR(Optical Character Recognition,光學字符識別)難以識別的字符驗證碼。
CSDN:請談談火柴驗證碼的技術實現原理。
葛付榮:傳統圖片驗證碼一般是由程序自動扭曲字符生成,因為源圖片內容單一、混淆算法有限、干擾因素較多,容易被窮舉破解,而且用戶體驗較差。這就是為什么像12306這類網站即便在前端不斷提高用戶驗證難度,卻仍然會被搶票軟件輕松破解的原因之一。
然而火柴手寫碼所采用的手寫字符,其識別工作在OCR領域一直是個難題。正如上面所說,即便是同一個人,在不同時間、不同場景下書寫同一個字符,由于書寫時的方式、筆、紙張、環境等因素的不同,都可能導致書寫結果的不一致。下圖是同一人書寫的24個數字“8”。正是基于人手寫字符的難破譯性,火柴手寫碼在經過對國人書寫習慣的識別和研究后,形成了穩定手寫數據收集渠道,龐大而復雜的字符數據庫為火柴手寫碼的誕生提供素材保障。
CSDN:數據收集之后的具體處理經過是怎樣的?
葛付榮:收集到大量手寫數據后,火柴手寫碼還需經過過濾、切割、降噪、再組合等過程,才最終形成用戶所看到的驗證碼。
過濾切割:為增加破解難度,手寫素材要經過源數據過濾系統的過濾,以及在有效區域內切割成單字符圖片,去除掉模糊、殘缺的素材后才可進一步使用。
降噪:經過過濾切割后,還將采用均值濾波器、中值濾波器等圖像降噪方法,最大化地去除干擾因素,獲得更清晰、肉眼容易識別但OCR難以識別的圖片。
再組合:在得到有效的單字符圖片后,火柴驗證碼還需按照一定的算法隨機組成,才可形成最終驗證碼。并且在這一過程中,系統會自動規避掉重復數字以及簡單規律數字的組合可能。以6位數字驗證碼為例,系統會取6張有效的單數字圖片組合在一起,如果遇到安全性略差的連續相同數字的話,則會重新組合。
這一系列處理的好處是,保證了手寫驗證碼難以破解,但用戶在使用上又不會難以識別。火柴手寫碼一直堅持簡單操作的用戶體驗原則,所以用作生成手寫碼的字符都是一些普通用戶常見的字符,且字符間距較大,不會出現傳統驗證碼的扭曲、粘連現象,用戶更容易辨識,操作更加輕松簡單。目前,火柴手寫碼提供Demo、SDK。開發者可以將手寫碼輕松地部署到網站或其他產品上。從而節省開發成本。
CSDN:這個項目目前有哪些渠道與其他開發者合作?
葛付榮:火柴手寫碼一定是與其他開發者合作才有其存在價值與生存空間的。在產品設計之初我們就遵循可輕松部署、快速集成的原則。目前我們已經推出開放平臺,希望越來越多的開發者能使用我們的驗證碼,而不是費時費力地自行開發。
CSDN:2015年在項目運營中有哪些規劃?
葛付榮:我們將繼續在清晰度與安全性之間尋找平衡點,爭取用戶一眼就能看清、OCR五秒都無法識別。此外,還計劃從目前的純數字逐漸形成數字、英文字母、簡體中文漢字,以及其他特殊字符等多種手寫碼混排的格局。并且還將嘗試每個手寫碼有且只用一次,以此提供破解復雜度。結合大數據行為分析,火柴手寫碼還將在不降低安全性的前提下為不同的用戶推薦不同的手寫碼。例如:為喜歡數字的用戶提供數字驗證碼,為喜歡漢字的用戶提供漢字驗證碼等。另一方面,我們在今年計劃逐漸將產品推向市場。逐步擴大邀請開發者試用范圍,促成更多網站、游戲使用火柴手寫碼。
【《近匠》AR學校:從教育領域看增強現實機遇何在】《近匠》第77期:從創業公司LeapMotion、uSens到微軟,越來越多的公司開始走進VR與AR領域,就連蘋果也不例外。“AR學校”從2005年便開始接觸AR技術,CEO趙良華從研發與市場角度分析了AR的現狀。
【《近匠》SENSORO CTO趙東煒:解密iBeacon生態】《近匠》第76期:微信推出的“搖一搖周邊”功能,通過連接人與場景,讓iBeacon技術以巧妙的角度融入了我們的生活。技術上,復雜的場景要如何部署?市場上,有哪些機會和問題?為此我們采訪了SENSORO的CTO趙東煒。
【《近匠》Amaze UI:做最懂中國程序員的開源HTML5框架】《近匠》75期,HTML5的定稿以及Web組件化讓移動Web開發到了異常火爆的地步,跨屏跨平臺的開源HTML5開發框架Amaze UI強調移動優先,為國內的開發者提供最具本土特色的組件工具,降低開發門檻,讓應用開發變得更簡單。
及線下開發者活動信息,請關注mobilehub公眾微信號(ID: mobilehub)
尋求《近匠》免費報道,請私信:@CSDN移動,或發送郵件至mobile#csdn.net。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。