簡單驗證碼生成

1 修改記錄

時間 描述
2017-08-29 建檔

2 正文內容

  聲明:本文章使用了 http://www.cnblogs.com/AdamFamily/p/6379676.html 的代碼和思路。
  簡單驗證碼生成方法。屬性和生成方式封裝在VerificationCode類。

2.1 基本屬性

  基本屬性包括以下部分:

名稱 類型 默認值 描述
width Integer 90 驗證碼圖片寬度
height Integer 20 驗證碼圖片高度
fontHeight Integer 18 驗證碼字體大小
codeNum Integer 4 驗證碼數量
codeSequence char[] A-Za-z0-9 驗證碼可選列表,不包括大寫的i和小寫的L。該屬性不提供Setter方法

  代碼如下:

private Integer width = 90;// 驗證碼圖片寬度

private Integer height = 20;// 驗證碼圖片高度

private Integer fontHeight = 18;// 驗證碼字體高度:默認爲18

private Integer codeNum = 4;// 驗證碼數量:默認爲4

private char[] codeSequence = {
        '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',
        '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',
        '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };

public Integer getWidth() {
    return width;
}

public void setWidth(Integer width) {
    this.width = width;
}

public Integer getHeight() {
    return height;
}

public void setHeight(Integer height) {
    this.height = height;
}

public Integer getFontHeight() {
    return fontHeight;
}

public void setFontHeight(Integer fontHeight) {
    this.fontHeight = fontHeight;
}

public Integer getCodeNum() {
    return codeNum;
}

public void setCodeNum(Integer codeNum) {
    this.codeNum = codeNum;
}

public char[] getCodeSequence() {
    return codeSequence;
}

2.2 保存結果

  需要保存的結果有兩個:

名稱 類型 默認值 描述
bufferedImage BufferedImage null 驗證碼圖片緩衝。該屬性不提供Setter方法
codeString String null 驗證碼字符串。該屬性不提供Setter方法

  代碼如下:

private String codeString;// 驗證碼

private BufferedImage bufferedImage;// 驗證碼圖片

public String getCodeString() {
    return codeString;
}

public BufferedImage getBufferedImage() {
    return bufferedImage;
}

2.3 生成驗證碼

public void generate() {
    // 定義圖像buffer
    bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

    Graphics gd = bufferedImage.getGraphics();// 獲取圖像的畫筆
    gd.setColor(Color.WHITE);// 設置畫筆顏色:白色
    gd.fillRect(0, 0, width, height);// 畫一個矩形面
    gd.setColor(Color.BLACK);// 設置畫筆顏色:黑色
    gd.drawRect(0, 0, width - 1, height - 1);// 畫一個矩形框

    Random random = new Random();
    // 隨機產生40條幹擾線,使圖象中的認證碼不易被其它程序探測到。
    gd.setColor(Color.BLACK);
    for (int i = 0; i < 40; i++) {
        int start_x = random.nextInt(width);
        int start_y = random.nextInt(height);
        int offset_x = random.nextInt(12);
        int offset_y = random.nextInt(12);
        gd.drawLine(start_x, start_y, start_x + offset_x, start_y + offset_y);
    }

    // codes用於保存隨機產生的驗證碼,以便用戶登錄後進行驗證。
    gd.setFont(new Font("Fixedsys", Font.BOLD, fontHeight));// 設置畫筆字體屬性
    for (int i = 0; i < codeNum; i++) {
        String code = String.valueOf(codeSequence[random.nextInt(codeSequence.length-1)]);
        gd.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)));
        gd.drawString(code, (i + 1) * 15, 16);
        this.codeString+=code;
    }
    log.info("驗證碼:{}", this.codeString);
}

2.4 使用方法

  本文章建立在Spring框架上:

@RequestMapping("/verification")
public void getCode(VerificationCode verificationCode, HttpServletRequest req, HttpServletResponse resp) {
    // 將四位數字的驗證碼保存到Session中。
    HttpSession session = req.getSession();
    System.out.print(verificationCode);
    session.setAttribute("code", verificationCode.getCodeString());

    // 禁止圖像緩存。
    resp.setHeader("Pragma", "no-cache");
    resp.setHeader("Cache-Control", "no-cache");
    resp.setDateHeader("Expires", 0);
    resp.setContentType("image/jpeg");

    // 將圖像輸出到Servlet輸出流中。
    try {
        ServletOutputStream sos = resp.getOutputStream();
        ImageIO.write(verificationCode.getBufferedImage(), "jpeg", sos);
        sos.close();
    } catch (IOException e) {
        log.error(e.toString(), e);
    }
}

3 代碼地址

https://github.com/Chngzhen/projects/tree/master/project-pdms/src/main/java/chngzhen/pdms/web/common

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章