日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 生成验证码

發(fā)布時(shí)間:2025/3/15 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 生成验证码 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

服務(wù)器端代碼:

/*** 獲取驗(yàn)證碼圖片和文本(驗(yàn)證碼文本會(huì)保存在HttpSession中)*/@RequestMapping("/getVerifyCodeImage")public void getVerifyCodeImage(HttpServletRequest request,HttpServletResponse response) throws IOException {response.setHeader("Pragma", "No-cache");response.setHeader("Cache-Control", "No-cache");response.setDateHeader("Expires", 0);// 指定生成的響應(yīng)圖片,一定不能缺少這句話,否則錯(cuò)誤.response.setContentType("image/jpeg");int width = 86, height = 32; // 指定生成驗(yàn)證碼的寬度和高度BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB); // 創(chuàng)建BufferedImage對(duì)象,其作用相當(dāng)于一圖片Graphics g = image.getGraphics(); // 創(chuàng)建Graphics對(duì)象,其作用相當(dāng)于畫筆Graphics2D g2d = (Graphics2D) g; // 創(chuàng)建Grapchics2D對(duì)象Random random = new Random();Font mfont = new Font("楷體", Font.BOLD, 20); // 定義字體樣式g.setColor(getRandColor(200, 250));g.fillRect(0, 0, width, height); // 繪制背景g.setFont(mfont); // 設(shè)置字體g.setColor(getRandColor(220, 240));// 繪制100條顏色和位置全部為隨機(jī)產(chǎn)生的線條,該線條為2ffor (int i = 0; i < 100; i++) {int x = random.nextInt(width - 1);int y = random.nextInt(height - 1);int x1 = random.nextInt(6) + 1;int y1 = random.nextInt(12) + 1;BasicStroke bs = new BasicStroke(2f, BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL); // 定制線條樣式Line2D line = new Line2D.Double(x, y, x + x1, y + y1);g2d.setStroke(bs);g2d.draw(line); // 繪制直線}// 輸出由英文,數(shù)字,和中文隨機(jī)組成的驗(yàn)證文字,具體的組合方式根據(jù)生成隨機(jī)數(shù)確定。String sRand = "";String ctmp = "";int itmp = 0;// 制定輸出的驗(yàn)證碼為四位for (int i = 0; i < 4; i++) {switch (random.nextInt(1)) { // 4包含漢字 3字母和數(shù)字 2字母和數(shù)字 1數(shù)字case 1: // 生成A-Z的字母itmp = random.nextInt(26) + 65;while (itmp == (65 + 8) || itmp == (65 + 11)) {itmp = random.nextInt(26) + 65;}ctmp = String.valueOf((char) itmp).toLowerCase();break;case 2:itmp = random.nextInt(10) + 48;ctmp = String.valueOf((char) itmp);break;case 3: // 生成漢字String[] rBase = { "0", "1", "2", "3", "4", "5", "6", "7", "8","9", "a", "b", "c", "d", "e", "f" };// 生成第一位區(qū)碼int r1 = random.nextInt(3) + 11;String str_r1 = rBase[r1];// 生成第二位區(qū)碼int r2;if (r1 == 13) {r2 = random.nextInt(7);} else {r2 = random.nextInt(16);}String str_r2 = rBase[r2];// 生成第一位位碼int r3 = random.nextInt(6) + 10;String str_r3 = rBase[r3];// 生成第二位位碼int r4;if (r3 == 10) {r4 = random.nextInt(15) + 1;} else if (r3 == 15) {r4 = random.nextInt(15);} else {r4 = random.nextInt(16);}String str_r4 = rBase[r4];// 將生成的機(jī)內(nèi)碼轉(zhuǎn)換為漢字byte[] bytes = new byte[2];// 將生成的區(qū)碼保存到字節(jié)數(shù)組的第一個(gè)元素中String str_12 = str_r1 + str_r2;int tempLow = Integer.parseInt(str_12, 16);bytes[0] = (byte) tempLow;// 將生成的位碼保存到字節(jié)數(shù)組的第二個(gè)元素中String str_34 = str_r3 + str_r4;int tempHigh = Integer.parseInt(str_34, 16);bytes[1] = (byte) tempHigh;ctmp = new String(bytes);break;default:itmp = random.nextInt(10) + 48;ctmp = String.valueOf((char) itmp);break;}sRand += ctmp;Color color = new Color(0 + random.nextInt(110),100 + random.nextInt(110), random.nextInt(110));g.setColor(color);// 將生成的隨機(jī)數(shù)進(jìn)行隨機(jī)縮放并旋轉(zhuǎn)制定角度 PS.建議不要對(duì)文字進(jìn)行縮放與旋轉(zhuǎn),因?yàn)檫@樣圖片可能不正常顯示/* 將文字旋轉(zhuǎn)制定角度 */Graphics2D g2d_word = (Graphics2D) g;AffineTransform trans = new AffineTransform();trans.rotate(((int) ((Math.random() * 40))) * 3.14 / 180,15 * i + 8, 7);/* 縮放文字 */float scaleSize = random.nextFloat() + 0.9f;if (scaleSize > 1f)scaleSize = 1f;trans.scale(scaleSize, scaleSize);g2d_word.setTransform(trans);g.drawString(ctmp, 15 * i + 18, 20);}HttpSession session = request.getSession(true);session.setAttribute("verifyCode", sRand);g.dispose(); // 釋放g所占用的系統(tǒng)資源ImageIO.write(image, "JPEG", response.getOutputStream()); // 輸出圖片}/* 該方法主要作用是獲得隨機(jī)生成的顏色 */private Color getRandColor(int s, int e) {Random random = new Random();if (s > 255)s = 255;if (e > 255)e = 255;int r, g, b;r = s + random.nextInt(e - s); // 隨機(jī)生成RGB顏色中的r值g = s + random.nextInt(e - s); // 隨機(jī)生成RGB顏色中的g值b = s + random.nextInt(e - s); // 隨機(jī)生成RGB顏色中的b值return new Color(r, g, b);}

前端點(diǎn)擊更換驗(yàn)證碼:在圖片上添加點(diǎn)擊事件changeImg()
<img src="getVerifyCodeImage" onclick="changeImg()">

function changeImg() {var imgSrc = document.getElementById('imgcode_img');var src = imgSrc.src;imgSrc.setAttribute("src", chgUrl(src)); }//時(shí)間戳 //為了使每次生成圖片不一致,即不讓瀏覽器讀緩存,所以需要加上時(shí)間戳 function chgUrl(url) {var timestamp = (new Date()).valueOf();if(url.indexOf("?", 0)>0){url = url.substring(0, url.indexOf("?", 0));}if ((url.indexOf("&") >= 0)) {url = url + "×tamp=" + timestamp;} else {url = url + "?timestamp=" + timestamp;}return url; }

驗(yàn)證碼準(zhǔn)確值保存在session中session.setAttribute("verifyCode", sRand); 后臺(tái)拿到用戶輸入的驗(yàn)證碼,再和session中的值比對(duì)即可判斷是否輸入正確。

總結(jié)

以上是生活随笔為你收集整理的java 生成验证码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。