首页 > 编程 > Java > 正文

Java生成图形验证码工具类

2019-11-26 13:06:44
字体:
来源:转载
供稿:网友

生成验证码效果

ValidateCode.java 验证码生成类

package cn.dsna.util.images; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Random; import javax.imageio.ImageIO; /**  * 验证码生成器  * @author dsna  *  */ public class ValidateCode {  // 图片的宽度。  private int width = 160;  // 图片的高度。  private int height = 40;  // 验证码字符个数  private int codeCount = 5;  // 验证码干扰线数  private int lineCount = 150;  // 验证码  private String code = null;  // 验证码图片Buffer  private BufferedImage buffImg=null;  private char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',    'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',    'X', 'Y', 'Z', '1', '2', '3', '4', '5', '6', '7', '8', '9' };  public ValidateCode() {   this.createCode();  }  /**   *   * @param width 图片宽   * @param height 图片高   */  public ValidateCode(int width,int height) {   this.width=width;   this.height=height;   this.createCode();  }  /**   *   * @param width 图片宽   * @param height 图片高   * @param codeCount 字符个数   * @param lineCount 干扰线条数   */  public ValidateCode(int width,int height,int codeCount,int lineCount) {   this.width=width;   this.height=height;   this.codeCount=codeCount;   this.lineCount=lineCount;   this.createCode();  }  public void createCode() {   int x = 0,fontHeight=0,codeY=0;   int red = 0, green = 0, blue = 0;   x = width / (codeCount +2);//每个字符的宽度   fontHeight = height - 2;//字体的高度   codeY = height - 4;   // 图像buffer   buffImg = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);   Graphics2D g = buffImg.createGraphics();   // 生成随机数   Random random = new Random();   // 将图像填充为白色   g.setColor(Color.WHITE);   g.fillRect(0, 0, width, height);   // 创建字体   ImgFontByte imgFont=new ImgFontByte();   Font font =imgFont.getFont(fontHeight);   g.setFont(font);   for (int i = 0; i < lineCount; i++) {    int xs = random.nextInt(width);    int ys = random.nextInt(height);    int xe = xs+random.nextInt(width/8);    int ye = ys+random.nextInt(height/8);    red = random.nextInt(255);    green = random.nextInt(255);    blue = random.nextInt(255);    g.setColor(new Color(red, green, blue));    g.drawLine(xs, ys, xe, ye);   }   // randomCode记录随机产生的验证码   StringBuffer randomCode = new StringBuffer();   // 随机产生codeCount个字符的验证码。   for (int i = 0; i < codeCount; i++) {    String strRand = String.valueOf(codeSequence[random.nextInt(codeSequence.length)]);    // 产生随机的颜色值,让输出的每个字符的颜色值都将不同。    red = random.nextInt(255);    green = random.nextInt(255);    blue = random.nextInt(255);    g.setColor(new Color(red, green, blue));    g.drawString(strRand, (i + 1) * x, codeY);    // 将产生的四个随机数组合在一起。    randomCode.append(strRand);   }   // 将四位数字的验证码保存到Session中。   code=randomCode.toString();   }  public void write(String path) throws IOException {   OutputStream sos = new FileOutputStream(path);    this.write(sos);  }  public void write(OutputStream sos) throws IOException {    ImageIO.write(buffImg, "png", sos);    sos.close();  }  public BufferedImage getBuffImg() {   return buffImg;  }  public String getCode() {   return code;  } } 

ImgFontByte.java

package cn.dsna.util.images; import java.io.ByteArrayInputStream; import java.awt.*; /**  * ttf字体文件  * @author dsna  *  */ public class ImgFontByte {  public Font getFont(int fontHeight){   try {    Font baseFont = Font.createFont(Font.TRUETYPE_FONT, new ByteArrayInputStream(hex2byte(getFontByteStr())));    return baseFont.deriveFont(Font.PLAIN, fontHeight);   } catch (Exception e) {    return new Font("Arial",Font.PLAIN, fontHeight);   }  }  private byte[] hex2byte(String str) {   if (str == null)    return null;   str = str.trim();   int len = str.length();   if (len == 0 || len % 2 == 1)    return null;   byte[] b = new byte[len / 2];   try {    for (int i = 0; i < str.length(); i += 2) {     b[i / 2] = (byte) Integer       .decode("0x" + str.substring(i, i + 2)).intValue();    }    return b;   } catch (Exception e) {    return null;   }  } /**  * ttf字体文件的十六进制字符串  * @return  */  private String getFontByteStr(){ return null;   return str;//字符串太长 在附件中找 } } 

ValidateCodeServlet.java Servlet调用方法

package cn.dsna.util.images; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class ValidateCodeServlet extends HttpServlet {  private static final long serialVersionUID = 1L;  @Override  protected void doGet(HttpServletRequest reqeust,    HttpServletResponse response) throws ServletException, IOException {   // 设置响应的类型格式为图片格式   response.setContentType("image/jpeg");   //禁止图像缓存。   response.setHeader("Pragma", "no-cache");   response.setHeader("Cache-Control", "no-cache");   response.setDateHeader("Expires", 0);   HttpSession session = reqeust.getSession();   ValidateCode vCode = new ValidateCode(120,40,5,100);   session.setAttribute("code", vCode.getCode());   vCode.write(response.getOutputStream());  } /**  * web.xml 添加servlet  <servlet>   <servlet-name>validateCodeServlet</servlet-name>   <servlet-class>cn.dsna.util.images.ValidateCodeServlet</servlet-class>  </servlet>   <servlet-mapping>   <servlet-name>validateCodeServlet</servlet-name>   <url-pattern>*.images</url-pattern>  </servlet-mapping> 在地址栏输入XXX/dsna.images 测试  */ } 

 测试类

ValidateCodeTest.java

package cn.dsna.util.images; import java.io.IOException; import java.util.Date; public class ValidateCodeTest {  /**   * @param args   */  public static void main(String[] args) {   ValidateCode vCode = new ValidateCode(120,40,5,100);   try {    String path="D:/t/"+new Date().getTime()+".png";    System.out.println(vCode.getCode()+" >"+path);    vCode.write(path);   } catch (IOException e) {    e.printStackTrace();   }  } } 

web.xml 配置

<servlet>  <servlet-name>validateCodeServlet</servlet-name>  <servlet-class>cn.dsna.util.images.ValidateCodeServlet</servlet-class> </servlet>  <servlet-mapping>  <servlet-name>validateCodeServlet</servlet-name>  <url-pattern>*.images</url-pattern> </servlet-mapping> 

以上所述是小编给大家介绍的Java生成图形验证码工具类,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对武林网网站的支持!

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表