1. 程式人生 > >java圖形驗證碼生成工具類及web頁面校驗驗證碼

java圖形驗證碼生成工具類及web頁面校驗驗證碼

組合 line des resp word buffere 需要 case ali

最近做驗證碼,參考網上案例,發現有不少問題,特意進行了修改和完善。

驗證碼生成器:

[html] view plain copy print?
  1. import javax.imageio.ImageIO;
  2. import java.awt.*;
  3. import java.awt.image.BufferedImage;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.io.OutputStream;
  7. import java.util.Date;
  8. import java.util.Random;
  9. /**
  10. * 驗證碼生成器
  11. *
  12. * @author
  13. */
  14. public class ValidateCode {
  15. // 圖片的寬度。
  16. private int width = 160;
  17. // 圖片的高度。
  18. private int height = 40;
  19. // 驗證碼字符個數
  20. private int codeCount = 5;
  21. // 驗證碼幹擾線數
  22. private int lineCount
    = 150;
  23. // 驗證碼
  24. private String code = null;
  25. // 驗證碼圖片Buffer
  26. private BufferedImage buffImg = null;
  27. // 驗證碼範圍,去掉0(數字)和O(拼音)容易混淆的(小寫的1和L也可以去掉,大寫不用了)
  28. private char[] codeSequence = {‘A‘, ‘B‘, ‘C‘, ‘D‘, ‘E‘, ‘F‘, ‘G‘, ‘H‘, ‘I‘, ‘J‘,
  29. ‘K‘, ‘L‘, ‘M‘, ‘N‘, ‘P‘, ‘Q‘, ‘R‘, ‘S‘, ‘T‘, ‘U‘, ‘V‘, ‘W‘,
  30. ‘X‘, ‘Y‘, ‘Z‘, ‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘, ‘7‘, ‘8‘, ‘9‘};
  31. /**
  32. * 默認構造函數,設置默認參數
  33. */
  34. public ValidateCode() {
  35. this.createCode();
  36. }
  37. /**
  38. * @param width 圖片寬
  39. * @param height 圖片高
  40. */
  41. public ValidateCode(int width, int height) {
  42. this.width = width;
  43. this.height = height;
  44. this.createCode();
  45. }
  46. /**
  47. * @param width 圖片寬
  48. * @param height 圖片高
  49. * @param codeCount 字符個數
  50. * @param lineCount 幹擾線條數
  51. */
  52. public ValidateCode(int width, int height, int codeCount, int lineCount) {
  53. this.width = width;
  54. this.height = height;
  55. this.codeCount = codeCount;
  56. this.lineCount = lineCount;
  57. this.createCode();
  58. }
  59. public void createCode() {
  60. int x = 0, fontHeight = 0, codeY = 0;
  61. int red = 0, green = 0, blue = 0;
  62. x = width / (codeCount + 2);//每個字符的寬度(左右各空出一個字符)
  63. fontHeight = height - 2;//字體的高度
  64. codeY = height - 4;
  65. // 圖像buffer
  66. buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
  67. Graphics2D g = buffImg.createGraphics();
  68. // 生成隨機數
  69. Random random = new Random();
  70. // 將圖像填充為白色
  71. g.setColor(Color.WHITE);
  72. g.fillRect(0, 0, width, height);
  73. // 創建字體,可以修改為其它的
  74. Font font = new Font("Fixedsys", Font.PLAIN, fontHeight);
  75. // Font font = new Font("Times New Roman", Font.ROMAN_BASELINE, fontHeight);
  76. g.setFont(font);
  77. for (int i = 0; i < lineCount; i++) {
  78. // 設置隨機開始和結束坐標
  79. int xs = random.nextInt(width);//x坐標開始
  80. int ys = random.nextInt(height);//y坐標開始
  81. int xe = xs + random.nextInt(width / 8);//x坐標結束
  82. int ye = ys + random.nextInt(height / 8);//y坐標結束
  83. // 產生隨機的顏色值,讓輸出的每個幹擾線的顏色值都將不同。
  84. red = random.nextInt(255);
  85. green = random.nextInt(255);
  86. blue = random.nextInt(255);
  87. g.setColor(new Color(red, green, blue));
  88. g.drawLine(xs, ys, xe, ye);
  89. }
  90. // randomCode記錄隨機產生的驗證碼
  91. StringBuffer randomCode = new StringBuffer();
  92. // 隨機產生codeCount個字符的驗證碼。
  93. for (int i = 0; i < codeCount; i++) {
  94. String strRand = String.valueOf(codeSequence[random.nextInt(codeSequence.length)]);
  95. // 產生隨機的顏色值,讓輸出的每個字符的顏色值都將不同。
  96. red = random.nextInt(255);
  97. green = random.nextInt(255);
  98. blue = random.nextInt(255);
  99. g.setColor(new Color(red, green, blue));
  100. g.drawString(strRand, (i + 1) * x, codeY);
  101. // 將產生的四個隨機數組合在一起。
  102. randomCode.append(strRand);
  103. }
  104. // 將四位數字的驗證碼保存到Session中。
  105. code = randomCode.toString();
  106. }
  107. public void write(String path) throws IOException {
  108. OutputStream sos = new FileOutputStream(path);
  109. this.write(sos);
  110. }
  111. public void write(OutputStream sos) throws IOException {
  112. ImageIO.write(buffImg, "png", sos);
  113. sos.close();
  114. }
  115. public BufferedImage getBuffImg() {
  116. return buffImg;
  117. }
  118. public String getCode() {
  119. return code;
  120. }
  121. /**
  122. * 測試函數,默認生成到d盤
  123. * @param args
  124. */
  125. public static void main(String[] args) {
  126. ValidateCode vCode = new ValidateCode(160,40,5,150);
  127. try {
  128. String path="D:/"+new Date().getTime()+".png";
  129. System.out.println(vCode.getCode()+" >"+path);
  130. vCode.write(path);
  131. } catch (IOException e) {
  132. e.printStackTrace();
  133. }
  134. }
  135. }

下面是頁面JS調用驗證碼

[javascript] view plain copy print?
  1. // 刷新圖片
  2. function changeImg() {
  3. var imgSrc = $("#imgObj");
  4. var url = imgSrc.attr("src");
  5. imgSrc.attr("src", changeUrl(url));
  6. }
  7. //為了使每次生成圖片不一致,即不讓瀏覽器讀緩存,所以需要加上時間戳
  8. function changeUrl(url) {
  9. var timestamp = (new Date()).valueOf();
  10. var index = url.indexOf("?");
  11. console.log(index);
  12. if (index > 0) {
  13. url = url.substring(0, url.indexOf("?"));
  14. }
  15. console.log(url);
  16. if ((url.indexOf("&") > 0)) {
  17. url = url + "×tamp=" + timestamp;
  18. console.log(url);
  19. } else {
  20. url = url + "?timestamp=" + timestamp;
  21. console.log(url);
  22. }
  23. return url;
  24. }

下面是controller層輸出驗證碼

[java] view plain copy print?
  1. /**
  2. * 響應驗證碼頁面
  3. * @return
  4. */
  5. @RequestMapping(value="/validateCode")
  6. public String validateCode(HttpServletRequest request,HttpServletResponse response) throws Exception{
  7. // 設置響應的類型格式為圖片格式
  8. response.setContentType("image/jpeg");
  9. //禁止圖像緩存。
  10. response.setHeader("Pragma", "no-cache");
  11. response.setHeader("Cache-Control", "no-cache");
  12. response.setDateHeader("Expires", 0);
  13. HttpSession session = request.getSession();
  14. ValidateCode vCode = new ValidateCode(120,40,5,100);
  15. session.setAttribute("code", vCode.getCode());
  16. vCode.write(response.getOutputStream());
  17. return null;
  18. }

下面是controller層驗證驗證碼輸入是否正確

[java] view plain copy print?
  1. String code = request.getParameter("code");
  2. HttpSession session = request.getSession();
  3. String sessionCode = (String) session.getAttribute("code");
  4. if (!StringUtils.equalsIgnoreCase(code, sessionCode)) { //忽略驗證碼大小寫
  5. throw new RuntimeException("驗證碼對應不上code=" + code + " sessionCode=" + sessionCode);
  6. }


java圖形驗證碼生成工具類及web頁面校驗驗證碼