1. 程式人生 > 實用技巧 >驗證碼的工具以及驗證碼的簡單應用和小tips

驗證碼的工具以及驗證碼的簡單應用和小tips

以前跟著寫的一段獲取驗證碼的servlet,當時覺得還挺麻煩的要自己畫,最近找到了一個封裝好的工具類記錄一下

先看看以前寫的獲取驗證碼的servlet

package cn.itcast.travel.web.servlet;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import java.awt.*; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random; /** * 驗證碼 */ @WebServlet("/checkCode") public class CheckCodeServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response)throws
ServletException, IOException { //伺服器通知瀏覽器不要快取 response.setHeader("pragma","no-cache"); response.setHeader("cache-control","no-cache"); response.setHeader("expires","0"); //在記憶體中建立一個長80,寬30的圖片,預設黑色背景 //引數一:長 //引數二:寬 //引數三:顏色 int
width = 80; int height = 30; BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); //獲取畫筆 Graphics g = image.getGraphics(); //設定畫筆顏色為灰色 g.setColor(Color.GRAY); //填充圖片 g.fillRect(0,0, width,height); //產生4個隨機驗證碼,12Ey String checkCode = getCheckCode(); //將驗證碼放入HttpSession中 request.getSession().setAttribute("CHECKCODE_SERVER",checkCode); //設定畫筆顏色為黃色 g.setColor(Color.YELLOW); //設定字型的小大 g.setFont(new Font("黑體",Font.BOLD,24)); //向圖片上寫入驗證碼 g.drawString(checkCode,15,25); //將記憶體中的圖片輸出到瀏覽器 //引數一:圖片物件 //引數二:圖片的格式,如PNG,JPG,GIF //引數三:圖片輸出到哪裡去 ImageIO.write(image,"PNG",response.getOutputStream()); } /** * 產生4位隨機字串 */ private String getCheckCode() { String base = "0123456789ABCDEFGabcdefg"; int size = base.length(); Random r = new Random(); StringBuffer sb = new StringBuffer(); for(int i=1;i<=4;i++){ //產生0到size-1的隨機值 int index = r.nextInt(size); //在base字串中獲取下標為index的字元 char c = base.charAt(index); //將c放入到StringBuffer中去 sb.append(c); } return sb.toString(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request,response); } }

下面是工具類 返回值是一個String 型別的code 還有一個BufferedImage image 物件

在Controller層用ImageIO.write(image,"png",response.getOutputStream)返回,把code存入Session中

package com.mkx_test.utils;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.Random;

public class CodeImageUtil {
    private static final char[] chars = {
            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'm', 'n',
            'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N',
            'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
    };
    // 字元數量
    private static final int SIZE = 4;
    // 干擾線數量
    private static final int LINES = 5;
    // 寬度
    private static final int WIDTH = 100;
    // 高度
    private static final int HEIGHT = 40;
    // 字型大小
    private static final int FONT_SIZE = 30;

    public static Object[] createImage(){
        StringBuffer sb = new StringBuffer();
        //建立空白圖片
        BufferedImage image = new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_RGB);
        //獲取圖片畫筆
        Graphics graphics = image.getGraphics();
        //設定畫筆顏色
        graphics.setColor(new Color(0xEDEDED));
        //繪製矩形背景
        graphics.fillRect(0,0,WIDTH,HEIGHT);
        //畫隨機字元
        Random random = new Random();
        for (int i=0;i<SIZE;i++){
            //獲取隨機字元索引
            int j = random.nextInt(chars.length);
            //設定隨機顏色
            graphics.setColor(getRandonColor());
            //設定字型大小
            graphics.setFont(new Font(null,Font.BOLD+Font.ITALIC,FONT_SIZE));
            //畫字元
            graphics.drawString(chars[j] + "",i * (WIDTH)/SIZE + 1,HEIGHT*2/3);
            //記錄字元
            sb.append(chars[j]);
        }
        //畫干擾線
        for (int i = 0;i<LINES;i++){
            //設定隨機顏色
            graphics.setColor(getRandonColor());
            //隨機畫線
            graphics.drawLine(random.nextInt(WIDTH),random.nextInt(HEIGHT),random.nextInt(WIDTH),random.nextInt(HEIGHT));
        }
        //返回驗證碼和圖片
        return new Object[]{sb.toString(),image};
    }

    /**
     * 隨機取色
     */
    private static Color getRandonColor() {
        Random random = new Random();
        Color color = new Color(random.nextInt(256),random.nextInt(256),random.nextInt(256));
        return color;
    }

//    public static void main(String[] args) throws IOException {
//        Object[] objs = createImage();
//        BufferedImage image = (BufferedImage) objs[1];
//        OutputStream os = new FileOutputStream("d:/1.png");
//        ImageIO.write(image, "png", os);
//        os.close();
//    }
}

Controller層中

 /*
    * 載入驗證碼
    */
    @RequestMapping("/getCode")
    public void getCode(HttpServletRequest request,HttpServletResponse response) throws IOException {
        Object[] objs = CodeImageUtil.createImage();
        String code = objs[0].toString();
        System.out.println("系統生成的驗證碼是:"+code);
        //image物件
        BufferedImage image =(BufferedImage) objs[1];
        //將記憶體中的圖片輸出到瀏覽器
        //引數一:圖片物件
        //引數二:圖片的格式,如PNG,JPG,GIF
        //引數三:圖片輸出到哪裡去
        ImageIO.write(image,"png",response.getOutputStream());
        request.getSession().setAttribute("code",code);
    }

檢視層jsp中:注意加上點選事件的時間戳,每次都能換到不同的驗證碼圖片

<div class="form-group">
                    <label for="codeInp">驗證碼</label>
                    <input type="text" id="codeInp" name="code"  >
                    <img id="code" src="${pageContext.request.contextPath}/user/getCode"  onclick="flushCode(this)">
                </div>

<script>
        function flushCode(obj) {
            let time = new Date().getTime();
            obj.src="${pageContext.request.contextPath}/user/getCode?"+time;
        }
    </script>