Java制作数字加减法验证码

简介: Java制作数字加减法验证码

Java制作数字加法验证码

简介

验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。可以防止:恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上用验证码是现在很多网站通行的方式,我们利用比较简易的方式实现了这个功能。这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答CAPTCHA的问题,所以回答出问题的用户就可以被认为是人类。

防止恶意破解密码、刷票、论坛灌水、刷页。

有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登录尝试,实际上使用验证码是现在很多网站通行的方式(比如招商银行的网上个人银行,百度社区),我们利用比较简易的方式实现了这个功能。虽然登录麻烦一点,但是对网友的密码安全来说这个功能还是很有必要,也很重要。但我们还是 提醒大家要保护好自己的密码 ,尽量使用混杂了数字、字母、符号在内的6位以上密码,不要使用诸如1234之类的简单密码或者与用户名相同、类似的密码 ,免得你的账号被人盗用给自己带来不必要的麻烦。

验证码通常使用一些线条和一些不规则的字符组成,主要作用是为了防止一些黑客把密码数据化盗取。

限制网络爬虫

由于验证码技术具有随机性较强、简单的特点,能够在一定程度上阻碍网络上恶意行为的访问,在互联网领域得到了广泛的应用。其次,图片验证码是通过爬虫获取到所需要的样本图片,将图片里面的文字和字母分开,通过神经网络算法去识别验证码。关于滑动验证码,一般情况下,人类在操作滑动这个步骤时,会有一个延时的动作,然后才进行滑块拖动,滑块移动时快慢不一致,最后再进行微微调整。拖动的路径基本上符合BETA分布这样的偏态分布,同时,人的行为也比较符合随机性和规律性特点,大体上符合BETA分布的规律,但是固定时间和间隔移动的长度是随机设置的。

效果展示

这样的验证码也是非常常见的,在我们的日常生活中,本文就是讲解,如何使用java制作这样一张验证码,然后后面作者还会结合前端项目进行讲解,如何把这个验证码放到前端的,登录页面里面。

代码演示

代码结构

最终把生成验证码的代码封装成一个函数,在这个函数中,可以自定义生成的计算的两个数字的范围,然后了这个是否为加减法也是随机的,然后这个返回的结果,是一个字符串,方便于校验。

// 设置生成的范围 
    public static String GenerateAVerificationCode(int a, int b) throws Exception{
        // 1.画什么
        Random random = new Random();
        // 生成前两个需要计算的数字
        int t1 = random.nextInt(a);
        int t2 = random.nextInt(b);
        System.out.println(t1 + " " + t2);
        // 生成计算的符号
        char t3 = random.nextInt(2) == 0 ? '+' : '-';
        int res = 0; // 最后的生成结果
        if (t3 == '+'){
            res = t1 + t2;
        } else {
            res = t1 - t2;
        }
        // 存生成的字母
        String randomStr = "";
        randomStr = ""+ t1 + t3 + t2;
        // 2.确定颜色
        // 背景色:底色(0~255)
        int red = random.nextInt(256);
        int green = random.nextInt(256);
        int blue = random.nextInt(256);
        Color bgColor = new Color(red, green, blue);
//        System.out.println(red + " " + green + " " + blue);
        // 前景色:人物,文字)
        int red2 = 255 - bgColor.getRed();
        int green2 = 255 - bgColor.getGreen();
        int blue2 = 255 - bgColor.getBlue();
        Color foreColor = new Color(red2, green2, blue2);
        // 3.开始画画(二维码)
        // 3.1准备画纸(大小)
        BufferedImage bufferedImage = new BufferedImage(80, 30, BufferedImage.TYPE_INT_RGB);
        // 3.2 准备画笔
        Graphics graphics = bufferedImage.getGraphics();
        // 3.3 画纸涂满底色
        graphics.setColor(bgColor);
        graphics.fillRect(0, 0, 80, 30);
        // 3.4 画笔换成前景色
        graphics.setColor(foreColor);
        graphics.setFont(new Font("黑体", Font.BOLD, 26));
        graphics.drawString(randomStr, 10, 28);
        // 画50个噪点
        for (int i = 0; i < 50; ++ i)
        {
            graphics.setColor(Color.white);
            int x = random.nextInt(80);
            int y = random.nextInt(30);
            graphics.fillRect(x, y, 1, 1);
        }
        // 3.5 展示观众
        FileOutputStream fileOutputStream = new FileOutputStream("src/main/resources/imgs/code.jpg");
        // 变成文件
        ImageIO.write(bufferedImage, "jpeg", fileOutputStream);
        System.out.println("二维码生成成功");
//        System.out.println(res);
        // 最后返回一个字符串结果
        return res + "";
    }

代码测试

经过代码测试,最后发现,我们的代码没有问题,完美。

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.util.Random;
public class Main2 {
    // 设置生成的范围
    public static String GenerateAVerificationCode(int a, int b) throws Exception{
        // 1.画什么
        Random random = new Random();
        // 生成前两个需要计算的数字
        int t1 = random.nextInt(a);
        int t2 = random.nextInt(b);
        System.out.println(t1 + " " + t2);
        // 生成计算的符号
        char t3 = random.nextInt(2) == 0 ? '+' : '-';
        int res = 0; // 最后的生成结果
        if (t3 == '+'){
            res = t1 + t2;
        } else {
            res = t1 - t2;
        }
        // 存生成的字母
        String randomStr = "";
        randomStr = ""+ t1 + t3 + t2;
        // 2.确定颜色
        // 背景色:底色(0~255)
        int red = random.nextInt(256);
        int green = random.nextInt(256);
        int blue = random.nextInt(256);
        Color bgColor = new Color(red, green, blue);
//        System.out.println(red + " " + green + " " + blue);
        // 前景色:人物,文字)
        int red2 = 255 - bgColor.getRed();
        int green2 = 255 - bgColor.getGreen();
        int blue2 = 255 - bgColor.getBlue();
        Color foreColor = new Color(red2, green2, blue2);
        // 3.开始画画(二维码)
        // 3.1准备画纸(大小)
        BufferedImage bufferedImage = new BufferedImage(80, 30, BufferedImage.TYPE_INT_RGB);
        // 3.2 准备画笔
        Graphics graphics = bufferedImage.getGraphics();
        // 3.3 画纸涂满底色
        graphics.setColor(bgColor);
        graphics.fillRect(0, 0, 80, 30);
        // 3.4 画笔换成前景色
        graphics.setColor(foreColor);
        graphics.setFont(new Font("黑体", Font.BOLD, 26));
        graphics.drawString(randomStr, 10, 28);
        // 画50个噪点
        for (int i = 0; i < 50; ++ i)
        {
            graphics.setColor(Color.white);
            int x = random.nextInt(80);
            int y = random.nextInt(30);
            graphics.fillRect(x, y, 1, 1);
        }
        // 3.5 展示观众
        FileOutputStream fileOutputStream = new FileOutputStream("src/main/resources/imgs/code.jpg");
        // 变成文件
        ImageIO.write(bufferedImage, "jpeg", fileOutputStream);
        System.out.println("二维码生成成功");
//        System.out.println(res);
        // 最后返回一个字符串结果
        return res + "";
    }
    public static void main(String[] args) throws Exception{
        System.out.println(GenerateAVerificationCode(450, 48));
    }
}

运行结果

通过测试,这个生成的结果非常的完美,通过测试。

相关文章
|
缓存 Java 应用服务中间件
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
5065 5
|
Java
Java 登录输入的验证码
Java 登录输入的验证码
253 1
|
存储 NoSQL Java
Redis系列学习文章分享---第三篇(Redis快速入门之Java客户端--短信登录+session+验证码+拦截器+登录刷新)
Redis系列学习文章分享---第三篇(Redis快速入门之Java客户端--短信登录+session+验证码+拦截器+登录刷新)
434 0
java加减法出题
java加减法出题
179 0
|
Java
JAVA生产随机生成验证码
Java代码实现随机生成指定位数的数字、大小写字母混合的验证码。使用`Random`类生成类型(0-数字,1-大写字母,2-小写字母),然后根据类型转换为相应字符。示例代码展示了一个4位验证码的生成,并附有实现结果图和过程分析。
559 2
|
安全 JavaScript 小程序
java 实现短信验证码
java 实现短信验证码
433 0
|
移动开发 前端开发 JavaScript
Java 验证码模块
Java 验证码模块
334 0
|
JavaScript Java
java生成验证码并进行验证
java生成验证码并进行验证
java实现动态验证码源代码——绘制验证码的jsp
java实现动态验证码源代码——绘制验证码的jsp
|
前端开发 Java
java实现动态验证码源代码——jsp页面
java实现动态验证码源代码——jsp页面