【转】java图形验证码生成工具类


生成验证码效果

 

 

 

 

  1 package cn.dsna.util.images;  
  2   
  3 import java.awt.Color;  
  4 import java.awt.Font;  
  5 import java.awt.Graphics2D;  
  6 import java.awt.image.BufferedImage;  
  7 import java.io.FileOutputStream;  
  8 import java.io.IOException;  
  9 import java.io.OutputStream;  
 10 import java.util.Random;  
 11   
 12 import javax.imageio.ImageIO;  
 13 /** 
 14  * 验证码生成器 
 15  * @author dsna 
 16  * 
 17  */  
 18 public class ValidateCode {  
 19     // 图片的宽度。  
 20     private int width = 160;  
 21     // 图片的高度。  
 22     private int height = 40;  
 23     // 验证码字符个数  
 24     private int codeCount = 5;  
 25     // 验证码干扰线数  
 26     private int lineCount = 150;  
 27     // 验证码  
 28     private String code = null;  
 29     // 验证码图片Buffer  
 30     private BufferedImage buffImg=null;  
 31   
 32     private char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',  
 33             'K', 'L', 'M', 'N',  'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',  
 34             'X', 'Y', 'Z',  '1', '2', '3', '4', '5', '6', '7', '8', '9' };  
 35   
 36     public  ValidateCode() {  
 37         this.createCode();  
 38     }  
 39   
 40     /** 
 41      *  
 42      * @param width 图片宽 
 43      * @param height 图片高 
 44      */  
 45     public  ValidateCode(int width,int height) {  
 46         this.width=width;  
 47         this.height=height;  
 48         this.createCode();  
 49     }  
 50     /** 
 51      *  
 52      * @param width 图片宽 
 53      * @param height 图片高 
 54      * @param codeCount 字符个数 
 55      * @param lineCount 干扰线条数 
 56      */  
 57     public  ValidateCode(int width,int height,int codeCount,int lineCount) {  
 58         this.width=width;  
 59         this.height=height;  
 60         this.codeCount=codeCount;  
 61         this.lineCount=lineCount;  
 62         this.createCode();  
 63     }  
 64       
 65     public void createCode() {  
 66         int x = 0,fontHeight=0,codeY=0;  
 67         int red = 0, green = 0, blue = 0;  
 68           
 69         x = width / (codeCount +2);//每个字符的宽度  
 70         fontHeight = height - 2;//字体的高度  
 71         codeY = height - 4;  
 72           
 73         // 图像buffer  
 74         buffImg = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);  
 75         Graphics2D g = buffImg.createGraphics();  
 76         // 生成随机数  
 77         Random random = new Random();  
 78         // 将图像填充为白色  
 79         g.setColor(Color.WHITE);  
 80         g.fillRect(0, 0, width, height);  
 81         // 创建字体  
 82         ImgFontByte imgFont=new ImgFontByte();  
 83         Font font =imgFont.getFont(fontHeight);  
 84         g.setFont(font);  
 85           
 86         for (int i = 0; i < lineCount; i++) {  
 87             int xs = random.nextInt(width);  
 88             int ys = random.nextInt(height);  
 89             int xe = xs+random.nextInt(width/8);  
 90             int ye = ys+random.nextInt(height/8);  
 91             red = random.nextInt(255);  
 92             green = random.nextInt(255);  
 93             blue = random.nextInt(255);  
 94             g.setColor(new Color(red, green, blue));  
 95             g.drawLine(xs, ys, xe, ye);  
 96         }  
 97           
 98         // randomCode记录随机产生的验证码  
 99         StringBuffer randomCode = new StringBuffer();  
100         // 随机产生codeCount个字符的验证码。  
101         for (int i = 0; i < codeCount; i++) {  
102             String strRand = String.valueOf(codeSequence[random.nextInt(codeSequence.length)]);  
103             // 产生随机的颜色值,让输出的每个字符的颜色值都将不同。  
104             red = random.nextInt(255);  
105             green = random.nextInt(255);  
106             blue = random.nextInt(255);  
107             g.setColor(new Color(red, green, blue));  
108             g.drawString(strRand, (i + 1) * x, codeY);  
109             // 将产生的四个随机数组合在一起。  
110             randomCode.append(strRand);  
111         }  
112         // 将四位数字的验证码保存到Session中。  
113         code=randomCode.toString();       
114     }  
115       
116     public void write(String path) throws IOException {  
117         OutputStream sos = new FileOutputStream(path);  
118             this.write(sos);  
119     }  
120       
121     public void write(OutputStream sos) throws IOException {  
122             ImageIO.write(buffImg, "png", sos);  
123             sos.close();  
124     }  
125     public BufferedImage getBuffImg() {  
126         return buffImg;  
127     }  
128       
129     public String getCode() {  
130         return code;  
131     }  
132 }  
ValidateCode.java验证码生成类
 1 package cn.dsna.util.images;  
 2 import java.io.ByteArrayInputStream;  
 3 import java.awt.*;  
 4 /** 
 5  * ttf字体文件 
 6  * @author dsna 
 7  * 
 8  */  
 9 public class ImgFontByte {  
10     public Font getFont(int fontHeight){  
11         try {  
12             Font baseFont = Font.createFont(Font.TRUETYPE_FONT, new ByteArrayInputStream(hex2byte(getFontByteStr())));  
13             return baseFont.deriveFont(Font.PLAIN, fontHeight);  
14         } catch (Exception e) {  
15             return new Font("Arial",Font.PLAIN, fontHeight);  
16         }  
17     }  
18       
19     private  byte[] hex2byte(String str) {   
20         if (str == null)  
21             return null;  
22         str = str.trim();  
23         int len = str.length();  
24         if (len == 0 || len % 2 == 1)  
25             return null;  
26   
27         byte[] b = new byte[len / 2];  
28         try {  
29             for (int i = 0; i < str.length(); i += 2) {  
30                 b[i / 2] = (byte) Integer  
31                         .decode("0x" + str.substring(i, i + 2)).intValue();  
32             }  
33             return b;  
34         } catch (Exception e) {  
35             return null;  
36         }  
37     } /** 
38   * ttf字体文件的十六进制字符串 
39   * @return 
40   */  
41  private String getFontByteStr(){ return null;  
42         return str;//字符串太长 在附件中找  
43 }  
44 }  
ImgFontByte.java代码
 1 package cn.dsna.util.images;  
 2   
 3 import java.io.IOException;  
 4 import javax.servlet.ServletException;  
 5 import javax.servlet.http.HttpServlet;  
 6 import javax.servlet.http.HttpServletRequest;  
 7 import javax.servlet.http.HttpServletResponse;  
 8 import javax.servlet.http.HttpSession;  
 9   
10 public class ValidateCodeServlet extends HttpServlet {  
11     private static final long serialVersionUID = 1L;  
12   
13     @Override  
14     protected void doGet(HttpServletRequest reqeust,  
15             HttpServletResponse response) throws ServletException, IOException {  
16         // 设置响应的类型格式为图片格式  
17         response.setContentType("image/jpeg");  
18         //禁止图像缓存。  
19         response.setHeader("Pragma", "no-cache");  
20         response.setHeader("Cache-Control", "no-cache");  
21         response.setDateHeader("Expires", 0);  
22           
23         HttpSession session = reqeust.getSession();  
24           
25         ValidateCode vCode = new ValidateCode(120,40,5,100);  
26         session.setAttribute("code", vCode.getCode());  
27         vCode.write(response.getOutputStream());  
28     }  
29 /** 
30  * web.xml 添加servlet 
31     <servlet> 
32         <servlet-name>validateCodeServlet</servlet-name> 
33         <servlet-class>cn.dsna.util.images.ValidateCodeServlet</servlet-class> 
34     </servlet>     
35     <servlet-mapping> 
36         <servlet-name>validateCodeServlet</servlet-name> 
37         <url-pattern>*.images</url-pattern> 
38     </servlet-mapping> 
39  
40 在地址栏输入XXX/dsna.images 测试 
41  */  
42   
43 } 
ValidateCodeServlet.java Servlet调用方法
 1 package cn.dsna.util.images;  
 2   
 3 import java.io.IOException;  
 4 import java.util.Date;  
 5   
 6 public class ValidateCodeTest {  
 7   
 8     /** 
 9      * @param args 
10      */  
11     public static void main(String[] args) {  
12         ValidateCode vCode = new ValidateCode(120,40,5,100);  
13         try {  
14             String path="D:/t/"+new Date().getTime()+".png";  
15             System.out.println(vCode.getCode()+" >"+path);  
16             vCode.write(path);  
17         } catch (IOException e) {  
18             e.printStackTrace();  
19         }  
20     }  
21   
22 } 
ValidateCodeTest.java代码
1 <servlet>  
2     <servlet-name>validateCodeServlet</servlet-name>  
3     <servlet-class>cn.dsna.util.images.ValidateCodeServlet</servlet-class>  
4 </servlet>      
5 <servlet-mapping>  
6     <servlet-name>validateCodeServlet</servlet-name>  
7     <url-pattern>*.images</url-pattern>  
8 </servlet-mapping>  
web.xml代码

dsnaValidateCode.jar (30.4 KB)

dsnaValidateCode_src.rar (27.5 KB)


来源网站:http://dsna.iteye.com/blog/573456


 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM