gpt4 book ai didi

Java生成图形验证码工具类

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 26 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章Java生成图形验证码工具类由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

生成验证码效果 。

Java生成图形验证码工具类

ValidateCode.java 验证码生成类 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
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 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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调用方法 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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 配置 。

?
1
2
3
4
5
6
7
8
<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生成图形验证码工具类,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我网站的支持! 。

最后此篇关于Java生成图形验证码工具类的文章就讲到这里了,如果你想了解更多关于Java生成图形验证码工具类的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com