欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

随机验证码案例实现

程序员文章站 2022-07-14 13:17:58
...

随机验证码案例实现

1.需求:

实现图片上四位随机字母和数字的验证码,并且图片上有线条和点的干扰

验证码的生成应该是在服务器端生成,响应回客户端,等客户端输入完信息后提交传回到服务器端进行判断,此过程涉及请求转发,需要跨Servlet传输数据,因此验证码的数据存储需要使用到域对象,这里使用ServletContext来进行数据存储

2.java图片操作技术

awt技术

2.1绘画对象:

BufferedImage
随机验证码案例实现
所有 BufferedImage 对象的左上角坐标都为 (0, 0)。

构造方法:
设置宽高和图片模式(RGB)
BufferedImage(int width, int height, int imageType)
默认的是背景黑色

2.2 image存储对象

ImageIO
随机验证码案例实现
在指定位置写入图片
ImageIO.write(bufferedImage,"jpg",new FileOutputStream("D:/test.jpg"));

2.3画布绘图对象

Graphics
随机验证码案例实现
获得画布对象
Graphics graphics = bufferedImage.getGraphics();

设置画笔颜色
graphics.setColor(Color.red);还可以使用RGB来设置颜色

//绘制矩形(参数是位置,长宽)
graphics.drawRect(20,20,50,40);
随机验证码案例实现
//绘制线条
graphics.drawLine(60,40,30,50);

//绘制文字
graphics.drawString("中文",40,30);
//绘制圆(本质是椭圆,参数是位置坐标,椭圆宽高)
graphics.drawOval(60,50,40,40);

//填充 需要提前设置画笔颜色,然后选择填充
graphics.setColor(Color.red);
填充圆
graphics.fillOval(60,50,40,40);

//设置字体
setFont(Font font)

3.案例实现:

目录结构:
随机验证码案例实现

html代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<form rel="stylesheet" action="#" method="post">
    用户名:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br><br>
    验证码:<img src="/c"><br>
    <input type="submit" name="提交" value="submit">
</form>

</body>
</html>

图片src地址通过web,xml文件配置,指向>com.example.draw.CodeServlet类

web.xml代码:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>COdeServlet</servlet-name>
        <servlet-class>com.example.draw.CodeServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>COdeServlet</servlet-name>
        <url-pattern>/c</url-pattern>
    </servlet-mapping>
</web-app>

CodeServlet类代码:

public class CodeServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置画布大小
        int width = 60;
        int height = 30;

        //先获取绘画对象BufferedImage
        BufferedImage bufferedImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);


        //用BufferedImage获取Graphics对象进行绘画
        Graphics graphics = bufferedImage.getGraphics();
        //设置画布底色为白色
        graphics.setColor(Color.white);
        graphics.fillRect(1,1,width-2,height-2);

        //定义字符和数字池
        String RESOURCE = "ABCDEFGHGKLMNPQRSTUVWXYZabcdefghijklmnpqrstuvwxyz23456789";

        //设置随机数,用下标获取池内的字符
        Random random = new Random();


        //循环获取字符四次
        for (int i = 0; i <4 ; i++) {
            int num = random.nextInt(RESOURCE.length());


            //设置字体
            Font font = new Font("宋体",Font.BOLD|Font.ITALIC,20);
            graphics.setFont(font);
            //先获取字符
            String result = String.valueOf(RESOURCE.charAt(num));

            //设置随机颜色写入字符

            graphics.setColor(new Color(random.nextInt(255),random.nextInt(255),random.nextInt(255)));
            int left = 10+i*10;
            graphics.drawString(result,left,20);

        }
        for (int i = 0; i < 6 ; i++) {
            //设置随机颜色画线条
            graphics.setColor(new Color(random.nextInt(255),random.nextInt(255),random.nextInt(255)));

            int x1 = random.nextInt(width-8)+2;
            int x2 = random.nextInt(width-8)+2;
            int y1 = random.nextInt(height-8)+2;
            int y2 = random.nextInt(height-8)+2;
            graphics.drawLine(x1,y1,x2,y2);

            //画点
            graphics.setColor(new Color(random.nextInt(255),random.nextInt(255),random.nextInt(255)));
            int x = random.nextInt(width-8)+2;
            int y = random.nextInt(height-8)+2;
            graphics.drawOval(x,y,0,0);
        }
        //图片保存对象ImageIO
        ImageIO.write(bufferedImage,"png",response.getOutputStream());
    }
}

4.实现点击刷新

点击图片刷新验证码
通过<style>标签设置样式,显示手型

    <style>
        img{
            cursor: pointer;
        }
    </style>

利用js绑定点击事件

<script>
    var img = document.getElementsByTagName("img")[0];
    img.onclick=function () {

        img.src = "/c?p="+new Date().getTime();
    }
    
</script>

这里img标签的src属性值除了地址之外加入了时间参数,原因是如果前后的地址没有发生变化,浏览器不会重新发送请求到服务器去获取,所以需要将地址进行动态更改,加入当前时间的毫秒数。

利用jQuery实现

    $(function(){

        $("#img").click(function (ev) {
            $(this).attr("src","/c?p="+new Date().getTime());
        });

    });

5.结果:

随机验证码案例实现
随机验证码案例实现

相关标签: # java基础 java