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

2023-11-11

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));
    }
}

运行结果
通过测试,这个生成的结果非常的完美,通过测试。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java如何制作图片输入验证码 的相关文章

  • 在 mvn 命令中指定 pom.xml 并混合其他项目的目标

    我有多个问题 我可以在 mvn 命令中指定 pom xml 吗 在当前项目上执行 mvn 命令时 我可以混合另一个项目的目标吗 例如 mvn clean otherproject comple otherproject install ot
  • JPA 中的复合键

    我想创建一个具有自动生成的主键的实体 而且还有一个由其他两个字段组成的唯一复合键 我如何在 JPA 中执行此操作 我想这样做是因为主键应该用作另一个表中的外键 并且使其复合并不好 在下面的代码片段中 我需要命令和模型是唯一的 pk当然是主键
  • 存根方法时出现 InvalidUseOfMatchersException

    我有这个 TestNG 测试方法代码 InjectMocks private FilmeService filmeService new FilmeServiceImpl Mock private FilmeDAO filmeDao Bef
  • 如何在 Firebase 远程配置中从 JSON 获取值

    我是 Android 应用开发和 Firebase 的新手 我想知道如何获取存储在 Firebase 远程配置中的 JSONArray 文件中的值 String 和 Int 我使用 Firebase Remote Config 的最终目标是
  • 使用 GWT 读取非常大的本地 XML 文件

    我正在使用 GWT 构建我的第一个 Java 应用程序 它必须从一个非常大的 XML 文件中读取数据 当我尝试发送对文件中信息的请求时遇到问题 并且我不太确定它是否与文件的大小或我的语义有关 在我的程序中 我有以下内容 static fin
  • 是否有任何简单(且最新)的 Java 框架可用于在 Swing 应用程序中嵌入电影?

    我正在构建一个小型 Swing 应用程序 我想在其中嵌入一部电影 重要的是 这个应用程序是一个 WebStart 应用程序 并且该库应该能够打包在我启动的 jnlp 中 即 不依赖于本机库 我知道并尝试过 JMF 但我认为与其他框架相比 其
  • 打印星号的 ASCII 菱形

    我的程序打印出这样的钻石 但只有当参数或菱形的每一面为4 例如如果我输入6 底部三角形的间距是错误的 我一直在试图找出答案 当参数改变时 底部的三角形不会改变 只有顶部的三角形会改变 它只适用于输入4 public static void
  • Java:在 eclipse 中导出到 .jar 文件

    我正在尝试将 Eclipse 中的程序导出到 jar 文件 在我的项目中 我添加了一些图片和 PDF s 当我导出到 jar 文件时 似乎只有main已编译并导出 我的意愿是如果可能的话将所有内容导出到 jar 文件 因为这样我想将其转换为
  • 自动生成Flyway的迁移SQL

    当通过 Java 代码添加新模型 字段等时 JPA Hibernate 的自动模式生成是否可以生成新的 Flyway 迁移 捕获自动生成的 SQL 并将其直接保存到新的 Flyway 迁移中 以供审查 编辑 提交到项目存储库 这将很有用 预
  • 从 GitHub 上托管的 Spring Cloud Config Server 访问存储库的身份验证问题

    我在 GitHub 上的存储库中托管配置 如果我将回购公开 一切都好 但如果我将其设为私有 我将面临 org eclipse jgit errors TransportException https github com my user m
  • 了解joda时间PeriodFormatter

    我以为我明白了 但显然我不明白 你能帮我通过这些单元测试吗 Test public void second assertEquals 00 00 01 OurDateTimeFormatter format 1000 Test public
  • 内部存储的安全性如何?

    我需要的 对于 Android 我需要永久保存数据 但也能够编辑 并且显然是读取 它 用户不应访问此数据 它可以包含诸如高分之类的内容 用户不得对其进行编辑 我的问题 我会 并且已经 使用过Internal Storage 但我不确定它实际
  • GWT 2.3 开发模式 - 托管模式 JSP 编译似乎不使用 java 1.5 兼容性

    无法编译 JSP 类 生成的 servlet 错误 DefaultMessage 上次更新 0 日期 中 0 时间 HH mm ss z 语法 错误 注释仅在源级别为 1 5 时可用 在尝试以开发模式在 Web 浏览器中打开我的 gwt 模
  • 使用架构注册表对 avro 消息进行 Spring 云合约测试

    我正在查看 spring 文档和 spring github 我可以看到一些非常基本的内容examples https github com spring cloud samples spring cloud contract sample
  • HashMap 值需要不可变吗?

    我知道 HashMap 中的键需要是不可变的 或者至少确保它们的哈希码 hashCode 不会改变或与另一个具有不同状态的对象发生冲突 但是 HashMap中存储的值是否需要与上面相同 为什么或者为什么不 这个想法是能够改变值 例如在其上调
  • 在 SWT/JFace RCP 应用程序中填充巨大的表

    您将如何在 SWT 表中显示大量行 巨大是指超过 20K 行 20 列的东西 不要问我为什么需要展示那么多数据 这不是重点 关键是如何让它尽可能快地工作 这样最终用户就不会厌倦等待 每行显示某个对象的实例 列是其属性 一些 我想使用 JFa
  • 返回 Java 8 中的通用函数接口

    我想写一种函数工厂 它应该是一个函数 以不同的策略作为参数调用一次 它应该返回一个函数 该函数根据参数选择其中一种策略 该参数将由谓词实现 嗯 最好看看condition3为了更好的理解 问题是 它没有编译 我认为因为编译器无法弄清楚函数式
  • Spring-ws:如何从没有“Request”元素的 xsd 创建 Wsdl

    尝试为客户端实现 SOAP Web 服务 我需要一个 wsdl 文件来通过soapUI 测试该服务 但正如您在下面看到的 这个 xsd 没有 Request 和 Response 方法 所有请求和响应都被定义为基本 ServiceProvi
  • Java Swing:需要一个高质量的带有复选框的开发 JTree

    我一直在寻找一个 Tree 实现 其中包含复选框 其中 当您选择一个节点时 树中的所有后继节点都会被自动选择 当您取消选择一个节点时 树中其所有后继节点都会自动取消选择 当已经选择了父节点 并且从其后继之一中删除了选择时 节点颜色将发生变化
  • 使用按钮作为列表的渲染器

    我想使用一个更复杂的渲染器 其中包含列表的多个组件 更准确地说 类似于this https stackoverflow com questions 10840498 java swing 1 6 textinput like firefox

随机推荐

  • FLASH擦除问题

    我们最近用mm32f3277的flash mm32f3277的flash有512K的空间 128个扇区 每个扇区有四页 每页有1K 图一 mm32f3277的flash 我们写入flash用的是片内FLASH存储器 片内FLASH存储器的地
  • java多线程异步处理批量数据

    前段时间需要一个批量请求别人接口的模块 由于别人接口反应速度慢导致批量请求耗费时间太多 于是在网上多发查询找到一个批量异步接口切能返回数据 多线程配置类 import org springframework aop interceptor
  • error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏

    一 问题描述 打开用VS2010打开vs 2008创建的解决方案 重新生成解决方案时 报如下错误 error LNK1123 转换到 COFF 期间失败 文件无效或损坏 二 原因分析 输入文件必须具有通用对象文件格式 COFF 如果输入文件
  • Maven 子项目

    使用maven搭建的子项目 其中包含web子项目和其他依赖子项目 在使用tomcat构建war的时候 会构建该web相对应的war maven关联的其他子项目会以jar包的形式关联到lib中 从而 使得web项目中可以引用其他包的类以及配置
  • 【C++】友元

    目录 友元的定义 全局函数做友元 类做友元 成员函数做友元 友元的定义 友元定义在类外面的一种函数或者类 友元不是成员函数 但是友元可以对某个类里面私有成员进行访问 要想友元获得访问某个类私有成员的权限 我们需要利用关键字friend并且在
  • eclipse web 项目中配置jetty-maven-plugin 版本 9.4.2.v20170220

    在web项目的pom xml文件中添加jetty maven plugin插件配置 如下
  • 【图像处理】去雾算法

    真正了解了什么叫最简单的就是最美好的 真正的好文章不需要大堆公式堆积显得充实 而是最最平实的思想 这篇文章的 原文PDF PPT 感兴趣的可以了解一下 这篇文章的目的就是以最简单的思路将图像达到去雾效果 用Matlab编了一下 效果图特别好
  • Windows11 安装 chocolatey 包管理器

    众所周知每个Linux发行版都有一个包管理器 比如Ubuntu的 apt get Centos的 yum Arch Linux的 pacman 那么问题来了 Windows有包管理器吗 Windows 目前最新版的系统有一个 winget
  • LLVM每日谈之十九 LLVM的第一本系统的书<Getting Started with LLVM Core Libraries>

    作者 史宁宁 snsn1984 LLVM最终有了一本系统的书了 Getting Started with LLVM Core Libraries 这本书号称是LLVM的第一本书 可是据说日本早就有两本日文的关于LLVM的书 这个了解的不多
  • 数据库学习笔记(4)——SQL语言之DQL

    复杂分组查询举例 子查询 把select查询结果当作数据使用时 这种结构就是子查询 子查询练习 子查询练习 查询学生成绩在70分以上的学生学号和姓名 select stu id as id stu name as 姓名 from tb st
  • 傻白探索Chiplet,关于EPYC Zen2 的一些理解记录(五)

    目录 一 知识铺垫 1 Chiplet 2 Zen架构 3 EPYC和Ryzen 4 EPYC Zen2 二 关于EPYC Zen2里的部件 1 内存控制器 2 PCIe控制器 3 Infinity Fabric总线 4 关于CCX和CCD
  • 深度学习之人物年龄预测

    1 年龄检测 论文地址 Age and Gender Classification using Convolutional Neural Networks 论文作者提出了一个简单的类似AlexNet的网络结构 该网络总共学习了8个年龄段 0
  • CentOS中DHCP服务器的搭建

    1 进入网卡配置文件 将网卡的网络修改为静态配置 2 yum y insytall dhcp 3 vi etc dhcp dhcpd conf 4 vi usr share doc dhcp dhcpd conf example 5 cp
  • 支付宝小程序 生成https链接 生成alipays协议链接

    生成https协议链接 const target 返回的页面地址 const online https render alipay com p s medical card online www index html returnUrl e
  • c语言课程设计(学生籍贯管理系统)学完c语言你可以做的案例

    目录 第一章 设计简介及设计方案讨论 1 1背景和意义 1 1 1背景 1 1 2意义 1 2需求分析 1 3使用说明 1 4流程图 1 5设计 1 5 1功能实现 第二章 核心代码讲解 2 1核心代码与分析 2 1 1代码和分析 第三章
  • tensorflow ResNet

    借鉴点 层间残差跳连 引入前方信息 减少梯度消失 使神经网络层数变身成为可能 ResNet 即深度残差网络 由何恺明及其团队提出 是深度学习领域又一具有开创性的 工作 通过对残差结构的运用 ResNet 使得训练数百层的网络成为了可能 从而
  • ROS理论与实践学习汇总(持续更新中······)

    创建工作空间 创建工作空间 mkdir p catkin ws src cd catkin ws src catkin init workspace 初始化 编译工作空间 cd catkin ws catkin make 设置环境变量 so
  • 07黑马QT笔记之信号重载时connect的写法(带参数的信号)

    07黑马QT笔记之信号重载时connect的写法 带参数的信号 1 首先说这个例子要做的事情 一个窗口有两个按钮 分别为按钮1 按钮2 当我按下按钮2时 他会发射两个信号 这两个信号重载 名字一样 所以当我接收这两个信号并处理时 conne
  • Web存储

    1 Web存储 locationStorage 用于永久性保存数据 sessionStorage 用于临时存储数据 关闭页面时 数据丢失 用法 两个对象用法一致 setItem key value 存储数据 getItem key 取数据
  • Java如何制作图片输入验证码

    Java如何制作图片输入验证码 简介 验证码 CAPTCHA 是 Completely Automated Public Turing test to tell Computers and Humans Apart 全自动区分计算机和人类的