好得很程序员自学网

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

java实现图片验证码

本文实例为大家分享了java实现图片验证码的具体代码,供大家参考,具体内容如下

目的:

1) 验证操作者是否是人

2) 防止表单重复提交

生成验证码的要点:

1) 使用java代码生成图片对象

BufferedImage

2) 使用Random生成随机字符串

3) 将图片对象用

ImageIO.write(图片对象, "jpeg|png", 响应字节输出流)
返回给客户端浏览器

验证验证码:

要点:

1) 将验证码文字存入session作用域

2) 表单提交时,对比session中的验证码和表单中的验证码

CaptchaUtils.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

package cn.seeker.utils;

 

import javax.imageio.ImageIO;

import java.awt.*;

import java.awt.image.BufferedImage;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStream;

import java.util.*;

import java.util.List;

 

public class CaptchaUtil {

 

    public static String [] fuhao = { "+" , "-" , "*" , "/" };

    public static int num = 0 ;

 

    //生成随机算式

    public static String random(){

 

        List list = new ArrayList();

        Random ran = new Random();

        int n1 = ran.nextInt( 10 );

        int n2 = ran.nextInt( 10 );

        String f = fuhao[ran.nextInt(fuhao.length)];

        StringBuilder sb = new StringBuilder( 4 );

 

        switch (f){

            case "+" :

                num = n1+n2;

                break ;

            case "-" :

                num =n1-n2;

                break ;

            case "*" :

                num = n1*n2;

                break ;

            case "/" :

                if (n2 == 0 ){

                    n2 = ran.nextInt( 10 )+ 1 ;

                    num = n1/n2;

                } else {

                    num = n1/n2;

                }

                break ;

        }

        sb.append(n1);

        sb.append(f);

        sb.append(n2);

        sb.append( "=" );

 

        return sb.toString();

    }

    public static void outputImage(String str, OutputStream os){

        Random ran = new Random();

        //创建图片对象

        BufferedImage img = new BufferedImage( 100 , 40 , BufferedImage.TYPE_INT_RGB);

        //获取画布

        Graphics g = img.getGraphics();

        //设置背景

        g.setColor(Color.white);

        g.fillRect( 0 , 0 , 100 , 40 );

        //写字

        g.setColor(Color.black);

        g.setFont( new Font( "微软雅黑" ,Font.PLAIN, 30 ));

        g.drawString(str, 10 , 40 );

        //随机三条线

        g.drawLine(ran.nextInt( 100 ),ran.nextInt( 40 ),

                ran.nextInt( 100 ),ran.nextInt( 40 ));

        g.drawLine(ran.nextInt( 100 ),ran.nextInt( 40 ),

                ran.nextInt( 100 ),ran.nextInt( 40 ));

        g.drawLine(ran.nextInt( 100 ),ran.nextInt( 40 ),

                ran.nextInt( 100 ),ran.nextInt( 40 ));

        // 4. 输出结果

        // 常见的压缩格式:jpeg(有损压缩), png(无损压缩) ...

        try {

            ImageIO.write(img, "png" , os);

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

 

 

}

regist.jsp

?

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

<%--

   Created by IntelliJ IDEA.

   User: Administrator

   Date: 2018/10/14

   Time: 15:43

   To change this template use File | Settings | File Templates.

--%>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

< html >

< head >

    < title >注册</ title >

    < style >

      

        img { cursor: pointer}

    </ style >

</ head >

< body >

< form action = "/regist" method = "post" >

    < img src = "/captcha.png" onclick = "changeImg(this)" >

    输入验证码:< input type = "text" name = "cap" >

    < input type = "submit" value = "提交" >

</ form >

 

< script >

 

    function changeImg(img) {

        // 浏览器有一个缓存特性,

        // 第一次从服务器获取图片,浏览器第二次发送请求时发现地址没有改变,就会使用第一次的图片,而不会真正发送请求

        // 为了让浏览器每次都把请求发送给服务器,给一个时间参数

        img.src = "/captcha.png?t="+new Date().getTime(); // 给src赋一个新值,就会向新值的地址发送一次请求

    }

</ script >

</ body >

</ html >

CaptchaServlet.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

package cn.seeker.controller;

 

import cn.seeker.utils.CaptchaUtil;

 

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

 

@WebServlet (urlPatterns = "/captcha.png" )

public class CaptchaServlet extends HttpServlet {

 

    @Override

    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

 

        response.setContentType( "image/png" );

        //获取随机字符串

        String random = CaptchaUtil.random();

        //输出图片

        CaptchaUtil.outputImage(random,response.getOutputStream());

        //存入结果

        request.getSession().setAttribute( "res" ,CaptchaUtil.num);

 

    }

 

 

}

registServlet.jsp

?

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

package cn.seeker.controller;

 

import javax.servlet.ServletException;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

 

@WebServlet (urlPatterns = "/regist" )

public class registServlet extends HttpServlet {

    @Override

    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        String cap = req.getParameter( "cap" );

        Integer res = (Integer)req.getSession().getAttribute( "res" );

        if (Integer.parseInt(cap) == res) {

            // 填写正确,注册成功

            req.getSession().removeAttribute( "res" );

            System.out.println( "注册成功" );

            resp.sendRedirect( "/index.jsp" );

 

        } else {

            req.setAttribute( "error" , "验证码不正确" );

            req.getRequestDispatcher( "/jsp/regist.jsp" ).forward(req,resp);

        }

    }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

原文链接:https://blog.csdn.net/qq_38454165/article/details/83097420

查看更多关于java实现图片验证码的详细内容...

  阅读:19次