本文实例为大家分享了Java使用Servlet生成验证码图片的具体代码,供大家参考,具体内容如下
一、实现思路
1、使用BufferedImage用于在内存中存储生成的验证码图片
2、使用Graphics来进行验证码图片的绘制,并将绘制在图片上的验证码存放到session中用于后续验证
3、最后通过ImageIO将生成的图片进行输出
4、页面通过访问servlet来获取并展示验证码
5、在后台获取页面提交的验证码,然后和存放在session中的验证码进行比对,进行校验
二、生成验证码
生成验证码的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
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
|
@WebServlet ( "/code" )
public class CodeController {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding( "utf-8" );
BufferedImage bfi = new BufferedImage( 80 , 25 ,BufferedImage.TYPE_INT_RGB);
Graphics g = bfi.getGraphics();
g.fillRect( 0 , 0 , 80 , 25 );
//验证码字符范围
char [] ch = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" .toCharArray();
Random r = new Random();
int index;
StringBuffer sb = new StringBuffer(); //保存字符串
for ( int i= 0 ; i< 4 ; i++){
index = r.nextInt(ch.length);
g.setColor( new Color(r.nextInt( 255 ),r.nextInt( 255 ),r.nextInt( 255 )));
Font font = new Font( "宋体" , 30 , 20 );
g.setFont(font);
g.drawString(ch[index]+ "" , (i* 20 )+ 2 , 23 );
sb.append(ch[index]);
}
// 添加噪点
int area = ( int ) ( 0.02 * 80 * 25 );
for ( int i= 0 ; i<area; ++i){
int x = ( int )(Math.random() * 80 );
int y = ( int )(Math.random() * 25 );
bfi.setRGB(x, y, ( int ) (Math.random() * 255 ));
}
//设置验证码中的干扰线
for ( int i = 0 ; i < 4 ; i++) {
//随机获取干扰线的起点和终点
int xstart = ( int )(Math.random() * 80 );
int ystart = ( int )(Math.random() * 25 );
int xend = ( int )(Math.random() * 80 );
int yend = ( int )(Math.random() * 25 );
g.setColor(interLine( 1 , 255 ));
g.drawLine(xstart, ystart, xend, yend);
}
HttpSession session = request.getSession(); //保存到session
session.setAttribute( "verificationCode" , sb.toString());
ImageIO.write(bfi, "JPG" , response.getOutputStream()); //写到输出流
}
private Color interLine( int Low, int High){
if (Low > 255 )
Low = 255 ;
if (High > 255 )
High = 255 ;
if (Low < 0 )
Low = 0 ;
if (High < 0 )
High = 0 ;
int interval = High - Low;
int r = Low + ( int )(Math.random() * interval);
int g = Low + ( int )(Math.random() * interval);
int b = Low + ( int )(Math.random() * interval);
return new Color(r, g, b);
}
}
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/tangyang8941/article/details/119853780