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