Java如何制作图片输入验证码

简介: Java如何制作图片输入验证码

Java如何制作图片输入验证码

简介:

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

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

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

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

限制网络爬虫

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

事例

在这张图的底部是有一个验证码的输入框,,右边的验证码机器很难进行识别,现在就是我,来讲解一下,如何用java制作这样的验证码。

代码讲解

在注释中写的很详细了,这个Java生成这个随机验证码的原理,通过运行我们也可以看见,在我们的代码的指定位置,已经生成了我们需要的验证码,而且每次的生成结果都是不一样的。

项目结构

完整代码

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 void main(String[] args) throws Exception{
        // 1.画什么
        String str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        Random random = new Random();
        // 存生成的字母
        String randomStr = "";
        for (int i = 0; i < 4; ++ i)
        {
            // 拿一个数据的位置
            int index = random.nextInt(str.length());
            char letter = str.charAt(index);
            randomStr += letter;
        }
        // 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("二维码生成成功");
    }
}

生成结果

封装成函数

我们将这个验证码封装成为函数之后,可以更好进行调用,下面就是这个功能的封装成函数之后的样子。

// 可以设置生成的位数 这个函数的返回值就是生成的验证码的值
    public static String GenerateAVerificationCode(int n) throws Exception{
        // 1.画什么
        String str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        Random random = new Random();
        // 存生成的字母
        String randomStr = "";
        for (int i = 0; i < n; ++ i)
        {
            // 拿一个数据的位置
            int index = random.nextInt(str.length());
            char letter = str.charAt(index);
            randomStr += letter;
        }
        // 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("二维码生成成功");
        return randomStr;
    }

运行测试

测试代码:

在这个代码中,我们打印这个生存代码的函数结果,我们写网页的时候只需要,返回这个结果就可以了,然后后端把这个生成的结果发送到前端,然后前端校验一下就可以了。

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 n) throws Exception{
        // 1.画什么
        String str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        Random random = new Random();
        // 存生成的字母
        String randomStr = "";
        for (int i = 0; i < n; ++ i)
        {
            // 拿一个数据的位置
            int index = random.nextInt(str.length());
            char letter = str.charAt(index);
            randomStr += letter;
        }
        // 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("二维码生成成功");
        return randomStr;
    }
    public static void main(String[] args) throws Exception{
        System.out.println(GenerateAVerificationCode(4));
    }
}

运行结果

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

相关文章
|
29天前
|
Java
Java开发实现图片URL地址检验,如何编码?
【10月更文挑战第14天】Java开发实现图片URL地址检验,如何编码?
60 4
|
29天前
|
Java
Java开发实现图片地址检验,如果无法找到资源则使用默认图片,如何编码?
【10月更文挑战第14天】Java开发实现图片地址检验,如果无法找到资源则使用默认图片,如何编码?
55 2
|
1月前
|
算法 Java Linux
java制作海报二:java使用Graphics2D 在图片上合成另一个照片,并将照片切割成头像,头像切割成圆形方法详解
这篇文章介绍了如何使用Java的Graphics2D类在图片上合成另一个照片,并将照片切割成圆形头像的方法。
48 1
java制作海报二:java使用Graphics2D 在图片上合成另一个照片,并将照片切割成头像,头像切割成圆形方法详解
|
29天前
|
Java 数据安全/隐私保护
Java ffmpeg 实现视频加文字/图片水印功能
【10月更文挑战第22天】在 Java 中使用 FFmpeg 实现视频加文字或图片水印功能,需先安装 FFmpeg 并添加依赖(如 JavaCV)。通过构建 FFmpeg 命令行参数,使用 `drawtext` 滤镜添加文字水印,或使用 `overlay` 滤镜添加图片水印。示例代码展示了如何使用 JavaCV 实现文字水印。
|
1月前
|
前端开发 小程序 Java
java基础:map遍历使用;java使用 Patten 和Matches 进行正则匹配;后端传到前端展示图片三种情况,并保存到手机
这篇文章介绍了Java中Map的遍历方法、使用Pattern和matches进行正则表达式匹配,以及后端向前端传输图片并保存到手机的三种情况。
19 1
|
1月前
|
算法 Java Linux
java制作海报四:java BufferedImage 转 InputStream 上传至OSS。png 图片合成到模板(另一个图片)上时,透明部分变成了黑色
这篇文章主要介绍了如何将Java中的BufferedImage对象转换为InputStream以上传至OSS,并解决了png图片合成时透明部分变黑的问题。
60 1
|
1月前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
105 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
1月前
|
Java
Java 登录输入的验证码
Java 登录输入的验证码
25 1
|
1月前
|
数据采集 自然语言处理 Python
用 Python 生成并识别图片验证码
用 Python 生成并识别图片验证码
29 1
|
2月前
|
Java
Java-FileInputStream和FileOutputStream的使用,txt文件及图片文件的拷贝
这篇文章介绍了Java中FileInputStream和FileOutputStream的使用,包括如何读取和写入txt文件以及如何拷贝图片文件。
Java-FileInputStream和FileOutputStream的使用,txt文件及图片文件的拷贝