java 生成验证码
生活随笔
收集整理的這篇文章主要介紹了
java 生成验证码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
服務器端代碼:
/*** 獲取驗證碼圖片和文本(驗證碼文本會保存在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);// 指定生成的響應圖片,一定不能缺少這句話,否則錯誤.response.setContentType("image/jpeg");int width = 86, height = 32; // 指定生成驗證碼的寬度和高度BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB); // 創建BufferedImage對象,其作用相當于一圖片Graphics g = image.getGraphics(); // 創建Graphics對象,其作用相當于畫筆Graphics2D g2d = (Graphics2D) g; // 創建Grapchics2D對象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); // 設置字體g.setColor(getRandColor(220, 240));// 繪制100條顏色和位置全部為隨機產生的線條,該線條為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); // 繪制直線}// 輸出由英文,數字,和中文隨機組成的驗證文字,具體的組合方式根據生成隨機數確定。String sRand = "";String ctmp = "";int itmp = 0;// 制定輸出的驗證碼為四位for (int i = 0; i < 4; i++) {switch (random.nextInt(1)) { // 4包含漢字 3字母和數字 2字母和數字 1數字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" };// 生成第一位區碼int r1 = random.nextInt(3) + 11;String str_r1 = rBase[r1];// 生成第二位區碼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];// 將生成的機內碼轉換為漢字byte[] bytes = new byte[2];// 將生成的區碼保存到字節數組的第一個元素中String str_12 = str_r1 + str_r2;int tempLow = Integer.parseInt(str_12, 16);bytes[0] = (byte) tempLow;// 將生成的位碼保存到字節數組的第二個元素中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);// 將生成的隨機數進行隨機縮放并旋轉制定角度 PS.建議不要對文字進行縮放與旋轉,因為這樣圖片可能不正常顯示/* 將文字旋轉制定角度 */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所占用的系統資源ImageIO.write(image, "JPEG", response.getOutputStream()); // 輸出圖片}/* 該方法主要作用是獲得隨機生成的顏色 */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); // 隨機生成RGB顏色中的r值g = s + random.nextInt(e - s); // 隨機生成RGB顏色中的g值b = s + random.nextInt(e - s); // 隨機生成RGB顏色中的b值return new Color(r, g, b);}前端點擊更換驗證碼:在圖片上添加點擊事件changeImg()
<img src="getVerifyCodeImage" onclick="changeImg()">
驗證碼準確值保存在session中session.setAttribute("verifyCode", sRand); 后臺拿到用戶輸入的驗證碼,再和session中的值比對即可判斷是否輸入正確。
總結
以上是生活随笔為你收集整理的java 生成验证码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: kafka key的作用_kafka系列
- 下一篇: java初始化数据报_java – 如