- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) >
- java后臺驗證碼生成的實(shí)現方法
效果圖如下:
后臺生成驗證碼,用于登陸驗證。
無(wú)(普通標簽)
1)前臺思路:
(1)前臺一個(gè)<input>用于輸入驗證碼;一個(gè)<img>用于展示驗證碼。
(2)驗證碼生成以及展示,點(diǎn)擊刷新功能,可以為<img>綁定click事件。
(3)click事件里面寫(xiě)ajax請求,通過(guò)后臺生成處理好的帶噪點(diǎn)的驗證碼圖片。
注意:后臺直接返回圖片,不是驗證碼的字符!若返回字符,則驗證碼就失去了意義(前臺很容易就可以獲取驗證碼字符,進(jìn)行多次惡意訪(fǎng)問(wèn)了)(這點(diǎn)考慮了系統安全性)
(4)關(guān)于返回的圖片如何在<img>標簽內展示
直接利用img的src屬性,屬性值為后臺生成驗證碼的方法請求路徑即可。當點(diǎn)擊驗證碼的時(shí)候,再動(dòng)態(tài)設置src屬性即可(原訪(fǎng)問(wèn)地址+隨機時(shí)間戳,防止同一路徑瀏覽器不另作訪(fǎng)問(wèn)的問(wèn)題)
前臺部分代碼:
/*驗證碼輸入框*/ <input class="verifyInput" name="verifyInput" placeholder="請輸入驗證碼"> /*驗證碼圖片*/ <img class="verifyCode" onclick="changeCode()" src="getVerifyCode"> //src的getVerifyCode是后臺訪(fǎng)問(wèn)地址;項目為SSM框架。 /*點(diǎn)擊刷新驗證碼*/ function changeCode(){ var src = " getVerifyCode?"+new Date().getTime(); //加時(shí)間戳,防止瀏覽器利用緩存 $('.verifyCode').attr("src",src); //jQuery寫(xiě)法 }
2)后臺思路:
后臺思路很簡(jiǎn)單,利用BufferedImage類(lèi)創(chuàng )建一張圖片,再用Graphics2D對圖片進(jìn)行繪制(生成隨機字符,添加噪點(diǎn),干擾線(xiàn))即可。注意生成的驗證碼字符串要放到session中,用于接下來(lái)登陸的驗證碼驗證(當然也是后臺)。
部分代碼如下:
/* 獲取驗證碼圖片*/ @RequestMapping("/getVerifyCode ") public void getVerificationCode(HttpServletResponse response,HttpServletRequest request) { try { int width=200; int height=69; BufferedImage verifyImg=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); //生成對應寬高的初始圖片 String randomText = VerifyCode.drawRandomText(width,height,verifyImg); //單獨的一個(gè)類(lèi)方法,出于代碼復用考慮,進(jìn)行了封裝。 //功能是生成驗證碼字符并加上噪點(diǎn),干擾線(xiàn),返回值為驗證碼字符 request.getSession().setAttribute("verifyCode", randomText); response.setContentType("image/png");//必須設置響應內容類(lèi)型為圖片,否則前臺不識別 OutputStream os = response.getOutputStream(); //獲取文件輸出流 ImageIO.write(verifyImg,"png",os);//輸出圖片流 os.flush(); os.close();//關(guān)閉流 } catch (IOException e) { this.logger.error(e.getMessage()); e.printStackTrace(); } }
/*對圖片進(jìn)行處理的類(lèi)和方法*/ public class VerifyCode { public static String drawRandomText(int width,int height,BufferedImage verifyImg) { Graphics2D graphics = (Graphics2D)verifyImg.getGraphics(); graphics.setColor(Color.WHITE);//設置畫(huà)筆顏色-驗證碼背景色 graphics.fillRect(0, 0, width, height);//填充背景 graphics.setFont(new Font("微軟雅黑", Font.BOLD, 40)); //數字和字母的組合 String baseNumLetter= = "123456789abcdefghijklmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"; StringBuffer sBuffer = new StringBuffer(); int x = 10; //旋轉原點(diǎn)的 x 坐標 String ch = ""; Random random = new Random(); for(int i = 0;i < 4;i++){ graphics.setColor(getRandomColor()); //設置字體旋轉角度 int degree = random.nextInt() % 30; //角度小于30度 int dot = random.nextInt(baseNumLetter.length()); ch = baseNumLetter.charAt(dot) + ""; sBuffer.append(ch); //正向旋轉 graphics.rotate(degree * Math.PI / 180, x, 45); graphics.drawString(ch, x, 45); //反向旋轉 graphics.rotate(-degree * Math.PI / 180, x, 45); x += 48; } //畫(huà)干擾線(xiàn) for (int i = 0; i <6; i++) { // 設置隨機顏色 graphics.setColor(getRandomColor()); // 隨機畫(huà)線(xiàn) graphics.drawLine(random.nextInt(width), random.nextInt(height), random.nextInt(width), random.nextInt(height)); } //添加噪點(diǎn) for(int i=0;i<30;i++){ int x1 = random.nextInt(width); int y1 = random.nextInt(height); graphics.setColor(getRandomColor()); graphics.fillRect(x1, y1, 2,2); } return sBuffer.toString(); } /** * 隨機取色 */ private static Color getRandomColor() { Random ran = new Random(); Color color = new Color(ran.nextInt(256), ran.nextInt(256), ran.nextInt(256)); return color; } }
驗證碼的功能實(shí)現思路很簡(jiǎn)單,從系統安全性和代碼復用性這兩點(diǎn)考慮,驗證碼必須后臺生成,生成驗證碼的方法可以封裝到靜態(tài)工具類(lèi)里。此外,后臺用到許多Java自帶的圖片處理類(lèi)值得學(xué)習。
到此這篇關(guān)于java后臺驗證碼生成的實(shí)現方法的文章就介紹到這了,更多相關(guān)java 驗證碼生成內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站