好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Java使用Servlet生成验证码图片

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

查看更多关于Java使用Servlet生成验证码图片的详细内容...

  阅读:20次