本文实例为大家分享了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