java中生成数字和字母验证码代码

import java.awt.Color;   

  1. import java.awt.Font;   

  2. import java.awt.Graphics2D;   

  3. import java.awt.p_w_picpath.BufferedImage;   

  4. import java.io.File;   

  5. import java.io.IOException;   

  6. import java.util.Random;   

  7. import javax.p_w_picpathio.ImageIO;   

  8. import org.springframework.stereotype.Component;   

  9. /** 

  10.  * @author wyh

  11.  * @Description 验证码生成类 

  12.  */

  13. @Component

  14. publicclass CheckCode {   

  15. privateint width = 102;   

  16. privateint height = 28;   

  17. privateint codeCount = 4;   

  18. private Random random = new Random();   

  19. /** 

  20.    * 验证码图片 

  21.    */

  22. private BufferedImage buffImg;   

  23. /** 

  24.    * 验证码字符串 

  25.    */

  26. private String checkCodeStr;   

  27. /** 

  28.    * @Description:创建验证码对象

  29.    * @return CheckCode 

  30.    */

  31. public CheckCode createCheckCode() {   

  32.         CheckCode checkCode = new CheckCode();   

  33.         checkCode.setCheckCodeStr(createRandomCode());   

  34.         checkCode.setBuffImg(disturb());   

  35. return checkCode;   

  36.     }   

  37. /** 

  38.    * @Description:随机产生的验证码 

  39.    * @return String 

  40.    */

  41. private String createRandomCode() {   

  42.         StringBuffer randomCode = new StringBuffer();   

  43.         String strRand = null;   

  44.         int xx = width / (codeCount + 1);   

  45.         int codeY = height - 4;   

  46.         char[] codeSequence = { 'A''B''C''D''E''F''G''H''J',   

  47.         'K''L''M''N''P''Q''R''S''T''U''V''W',   

  48.          'X''Y''Z''2''3''4''5''6''7''8''9' };   

  49.         Graphics2D graphics = graphicsInit();   

  50.         graphics.setColor(createColor());   

  51. for (int i = 0; i < codeCount; i++) {   

  52.             strRand = String.valueOf(codeSequence[random.nextInt(32)]);   

  53.             randomCode.append(strRand);   

  54.             graphics.drawString(strRand, (i + 1) * xx, codeY);   

  55.         }   

  56. return randomCode.toString();   

  57.     }   

  58. /** 

  59.    *  

  60.    * @Description:创建颜色 

  61.    * @return Color 

  62.    */

  63. private Color createColor() {   

  64.         Color color[] = new Color[10];   

  65.         color[0] = new Color(1133171);   

  66.         color[1] = new Color(37037);   

  67.         color[2] = new Color(1113336);   

  68.         color[3] = new Color(00112);   

  69.         color[4] = new Color(145116);   

  70.         color[5] = new Color(111);   

  71.         color[6] = new Color(721473);   

  72.         color[7] = new Color(656729);   

  73.         color[8] = new Color(1168688);   

  74.         color[9] = new Color(417571);   

  75. return color[random.nextInt(10)];   

  76.     }   

  77. /**   

  78.    * @Description:绘制类初始化 

  79.    * @return Graphics2D 

  80.    */

  81. private Graphics2D graphicsInit() {   

  82.         Graphics2D graphics = buffImgInit().createGraphics();   

  83.         graphics.setColor(Color.WHITE);   

  84.         graphics.fillRect(00, width, height);   

  85.         graphics.setFont(new Font("Fixedsys", Font.BOLD, height - 2));   

  86.         graphics.drawRect(00, width - 1, height - 1);   

  87. return graphics;   

  88.     }   

  89. /**

  90.    * @Description:BufferedImage初始化 

  91.    * @return BufferedImage 

  92.    */

  93. private BufferedImage buffImgInit() {   

  94.         buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);   

  95. return buffImg;   

  96.     }   

  97. /** 

  98.    * @Description:绘制干扰特性 

  99.    * @return BufferedImage 

  100.    */

  101. private BufferedImage disturb() {   

  102.         drawDisturbLine(buffImg.createGraphics());   

  103. return twistImage();   

  104.     }   

  105. /**

  106.    * @Description:画干扰线使图象中的认证码不易被其它程序探测到 

  107.    * @param graphics 

  108.    */

  109. privatevoid drawDisturbLine(Graphics2D graphics) {   

  110.         graphics.setColor(Color.BLACK);   

  111. int x = 0;   

  112. int y = 0;   

  113. int xl = 0;   

  114. int yl = 0;   

  115. for (int i = 0; i < 15; i++) {   

  116.             x = random.nextInt(width);   

  117.             y = random.nextInt(height);   

  118.             xl = random.nextInt(20);   

  119.             yl = random.nextInt(10);   

  120.             graphics.drawLine(x, y, x + xl, y + yl);   

  121.         }   

  122.     }   

  123. /** 

  124.    * @Description:正弦曲线Wave扭曲图片 

  125.    * @return BufferedImage 

  126.    */

  127. private BufferedImage twistImage() {   

  128. double dMultValue = random.nextInt(7) + 3;// 波形的幅度倍数,越大扭曲的程序越高,一般为3 

  129. double dPhase = random.nextInt(6);// 波形的起始相位,取值区间(0-2*PI) 

  130.         BufferedImage destBi = new BufferedImage(buffImg.getWidth(),   

  131.                 buffImg.getHeight(), BufferedImage.TYPE_INT_RGB);   

  132. for (int i = 0; i < destBi.getWidth(); i++) {   

  133. for (int j = 0; j < destBi.getHeight(); j++) {   

  134. int nOldX = getXPosition4Twist(dPhase, dMultValue,   

  135.                         destBi.getHeight(), i, j);   

  136. int nOldY = j;   

  137. if (nOldX >= 0 && nOldX < destBi.getWidth() && nOldY >= 0

  138.                         && nOldY < destBi.getHeight()) {   

  139.                     destBi.setRGB(nOldX, nOldY, buffImg.getRGB(i, j));   

  140.                 }   

  141.             }   

  142.         }   

  143. return destBi;   

  144.     }   

  145. /** 

  146.    * @Description:获取扭曲后的x轴位置 

  147.    * @param dPhase 

  148.    * @param dMultValue 

  149.    * @param height 

  150.    * @param xPosition 

  151.    * @param yPosition 

  152.    * @return int 

  153.    */

  154. privateint getXPosition4Twist(double dPhase, double dMultValue,   

  155. int height, int xPosition, int yPosition) {   

  156. double PI = 3.1415926535897932384626433832799// 此值越大,扭曲程度越大 

  157. double dx = (double) (PI * yPosition) / height + dPhase;   

  158. double dy = Math.sin(dx);   

  159. return xPosition + (int) (dy * dMultValue);   

  160.     }   

  161. /** 

  162.    * @Description:将图像进行输出到文件 

  163.    * @param pathName 

  164.    * @return String 

  165.    */

  166. public String createImgFile(String pathName) {   

  167.         File file = new File(pathName);   

  168. if (file.isFile() && file.exists()) {   

  169.             file.delete();   

  170.         }   

  171. try {   

  172.             ImageIO.write(buffImg, "jpeg", file);   

  173.         } catch (IOException e) {   

  174.             e.printStackTrace();   

  175.         }   

  176. return pathName;   

  177.     }   

  178. public BufferedImage getBuffImg() {   

  179. return buffImg;   

  180.     }   

  181. publicvoid setBuffImg(BufferedImage buffImg) {   

  182. this.buffImg = buffImg;   

  183.     }   

  184. public String getCheckCodeStr() {   

  185. return checkCodeStr;   

  186.     }   

  187. publicvoid setCheckCodeStr(String checkCodeStr) {   

  188. this.checkCodeStr = checkCodeStr;   

  189.     }   

  190. publicint getWidth() {   

  191. return width;   

  192.     }   

  193. publicvoid setWidth(int width) {   

  194. this.width = width;   

  195.     }   

  196. publicint getHeight() {   

  197. return height;   

  198.     }   

  199. publicvoid setHeight(int height) {   

  200. this.height = height;   

  201.     }   

  202. publicint getCodeCount() {   

  203. return codeCount;   

  204.     }   

  205. publicvoid setCodeCount(int codeCount) {   

  206. this.codeCount = codeCount;   

  207.     }   

  208. }