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