验证码技术 easy-captcha

news2024/11/17 21:28:56

依赖

<!-- easy-captcha用来生成验证码,由于jdk9以后,内置JavaScript去掉了,所以需要导入这个org.openjdk.nashorn -->
<dependency>
    <groupId>com.github.whvcse</groupId>
    <artifactId>easy-captcha</artifactId>
    <version>${easy-captcha.version}</version>
</dependency>
<dependency>
    <groupId>org.openjdk.nashorn</groupId>
    <artifactId>nashorn-core</artifactId>
    <version>${nashorn-core.version}</version>
</dependency>

工具类

/**
 * 验证码工具类
 *
 * @author hc
 */
public class CaptchaUtil {

    /**
     * 默认字体大小
     */
    private static Integer fontSize = 45;

    private static List<Font> list = new ArrayList<>();

    static {
        //静态代码快初始化,下面字体之所以注释掉是因为不好区分
        try {
            list.add(Font.createFont(Font.TRUETYPE_FONT, Objects.requireNonNull(Captcha.class.getResourceAsStream("/actionj.ttf"))));
            list.add(Font.createFont(Font.TRUETYPE_FONT, Objects.requireNonNull(Captcha.class.getResourceAsStream("/epilog.ttf"))));
            // list.add(Font.createFont(Font.TRUETYPE_FONT, Objects.requireNonNull(Captcha.class.getResourceAsStream("/fresnel.ttf"))));
//            list.add(Font.createFont(Font.TRUETYPE_FONT, Objects.requireNonNull(Captcha.class.getResourceAsStream("/headache.ttf"))));
//            list.add(Font.createFont(Font.TRUETYPE_FONT, Objects.requireNonNull(Captcha.class.getResourceAsStream("/lexo.ttf"))));
            list.add(Font.createFont(Font.TRUETYPE_FONT, Objects.requireNonNull(Captcha.class.getResourceAsStream("/prefix.ttf"))));
            list.add(Font.createFont(Font.TRUETYPE_FONT, Objects.requireNonNull(Captcha.class.getResourceAsStream("/progbot.ttf"))));
//            list.add(Font.createFont(Font.TRUETYPE_FONT, Objects.requireNonNull(Captcha.class.getResourceAsStream("/ransom.ttf"))));
            list.add(Font.createFont(Font.TRUETYPE_FONT, Objects.requireNonNull(Captcha.class.getResourceAsStream("/robot.ttf"))));
//            list.add(Font.createFont(Font.TRUETYPE_FONT, Objects.requireNonNull(Captcha.class.getResourceAsStream("/scandal.ttf"))));
        } catch (FontFormatException | IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * @param type   验证码图片的类型
     * @param width
     * @param height
     * @param length
     * @return
     */
    public static Captcha getCaptcha(int type, int width, int height, int length) {
        Captcha captcha;
        switch (type) {
            case 1:
                // 算术类型,固定设置为两位,图片为算数运算表达式
                captcha = new ArithmeticCaptcha(width, height, length);
                break;
            case 2:
                //中文
                captcha = new ChineseCaptcha(width, height, length);
                break;
            case 3:
                //中文gif
                captcha = new ChineseGifCaptcha(width, height, length);
                break;
            case 4:
                //gif英文
                captcha = new GifCaptcha(width, height, length);
                break;
            case 5: //默认
                captcha = new SpecCaptcha(width, height, length);
                break;
            default:
                throw new RuntimeException("验证码配置信息错误");
        }

        //也可以不设置字体,直接使用系统默认的字体
        // 随机字体
        final int index = (int) (Math.random() * list.size());
//        System.out.println("index  " + index);
        captcha.setFont(list.get(index).deriveFont(Font.BOLD, fontSize));

        return captcha;
    }

}

控制器

@RestController
@RequestMapping("/captcha")
public class CaptchaController {

    @GetMapping("/v1/get")
    public ResultBean<String> getCaptcha() {
        //生成验证码
        final Captcha captcha = CaptchaUtil.getCaptcha(1, 160, 55, 2);
        //验证码对应的文本
        System.out.println("验证码对应的文本: "+captcha.text());

        return captcha.toBase64();
    }

 }

效果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1864339.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis数据库(四):Redis数据库事务

经过前面的学习&#xff0c;我们就对于Redis数据库可以进行基本的操作&#xff0c;从这一节开始&#xff0c;我们就正式学习Redis数据库的相关知识&#xff0c;为以后工作打下坚实的基础。 目录 一、事务&#xff08;了解&#xff09; 1.1 Redis的事务概念 1.2 Redis事务…

黑马程序员——Spring框架——day09——linux初级

目录&#xff1a; 前言 什么是Linux&#xff1f;为什么要学Linux 企业用人要求个人发展需要学完Linux能干什么 1).环境搭建2).常用命令3).安装软件4).项目部署小结2.Linux简介 主流操作系统Linux发展历史Linux系统版本Linux安装 安装方式介绍安装VMware安装Linux网卡设置安装S…

我用过最好的GPT,NewspaceGPT使用心得

记住网址&#xff1a;https://newspace.ai0.cn 前言 只要你能表达明白&#xff0c;NewspaceGPT就不会让你失望。 Gpt4o预测GPT5 IT之家6月22日消息&#xff0c;在美国达特茅斯工程学院周四公布的采访中&#xff0c;OpenAI首席技术官米拉穆拉蒂被问及GPT-5是否会在明年发布&…

Beyond Compare不能比较Selinux te文件的解决方案

Beyond Compare不能比较Selinux te文件的解决方案 Beyond Compare默认不能比较te文件&#xff0c;现象如下&#xff1a; 问题原因&#xff1a; 是Beyond Compare将*.te文件识别为一个可执行文件&#xff0c;但是*.te不是一个可执行文件&#xff0c;所以打不开&#xff1b;即使…

微信群聊不见了?掌握这4个技巧轻松找回,简直太爽了

微信&#xff0c;作为国内最受欢迎的社交应用之一&#xff0c;其群聊功能极大地方便了人们的工作与生活。然而&#xff0c;随着加入的群聊数量日益增多&#xff0c;如何快速找到并管理这些群聊成为了一个难题。 幸运的是&#xff0c;微信提供了一些实用的技巧&#xff0c;帮助…

Vue原生写全选反选框

效果 场景&#xff1a;Vue全选框在头部&#xff0c;子框在v-for循环内部。 实现&#xff1a;点击全选框&#xff0c;所有子项选中&#xff0c;再次点击取消&#xff1b;子项全选中&#xff0c;全选框自动勾选&#xff0c;子项并未全选&#xff0c;全选框不勾选&#xff1b;已选…

2024全国大学生信息安全竞赛(ciscn)半决赛(华中赛区)Pwn题解

简介 前段时间赛前准备把ciscn东北赛区、华南赛区、西南赛区半决赛的题都复现完了。 可惜遇到了华东北赛区的离谱平台和离谱pwn出题人&#xff1a; 假的awdp&#xff08;直接传&#x1f40e;到靶机&#xff0c;然后连上去cat /flag.txt即可&#xff09;题型分布不合理&#…

fastadmin框架修改前端时间戳格式的时区

一、上传文件 将 moment-timezone-with-data.js 和 moment-timezone-with-data.min.js 文件上传到项目的 \public\assets\libs\moment\ 文件夹中。 二、配置中引入文件 在 \public\assets\js\require-backend.js 文件中增加所引入文件的配置: moment-timezone-with-data: …

【嵌入式Linux】i.MX6ULL GPIO 中断管理与配置函数

文章目录 GPIO 中断管理与配置函数1 GPIO中断服务号2 GPIO中断相关的寄存器配置3 具体代码分析3.1 数据结构和类型定义3.2 gpio_int_enable3.3 gpio_int_disable3.4 gpio_int_flagClear3.5 gpio_int_init3.6 gpio_init 4 完整代码 本文章结合了正点原子的 i.mx6u嵌入式Linux开发…

49、基于归一化感知器的输入向量分类(matlab)

1、基于归一化感知器的输入向量分类的原理及流程 归一化感知器是一种分类算法&#xff0c;其原理基于感知器算法&#xff0c;但是在输入向量上进行了归一化处理&#xff0c;以提高算法的性能和稳定性。 流程如下&#xff1a; 输入向量归一化&#xff1a;对每个输入向量进行归…

ChatGPT只是开胃菜,AIGC风口真的来了!

去年OpenAI发布的ChatGPT在全球疯狂刷屏成为一款现象级产品&#xff0c;并成功出圈受到IT、新闻媒体、学术研究、教育等领域的广泛好评和应用。甚至有一位美国学生用ChatGPT 写论文拿下全班最高分&#xff0c;受到了全球媒体的热议。 比尔盖茨曾在今年“Reddit AMA大会”表示&…

Mamba 模型

建议观看讲解视频&#xff1a;AI大讲堂&#xff1a;革了Transformer的小命&#xff1f;专业拆解【Mamba模型】_哔哩哔哩_bilibili 1. 论文基本信息 2. 创新点 选择性 SSM&#xff0c;和扩展 Mamba 架构&#xff0c;是具有关键属性的完全循环模型&#xff0c;这使得它们适合作…

武汉星起航:跨境电商直播带货热,推动中国出口销售新飞跃

随着数字化时代的到来&#xff0c;跨境电商领域正经历着前所未有的变革。中国商务部最近发布的数据显示&#xff0c;2023年中国跨境电商进出口总额达到2.38万亿元&#xff0c;同比增长15.6%&#xff0c;其中出口更是高达1.83万亿元&#xff0c;同比增长19.6%。这一亮眼成绩的背…

电脑开不了机怎么办?无响应就试试这3个方法,快速解决黑屏

当电脑突然变得沉默寡言&#xff0c;没有任何响应&#xff0c;屏幕只剩下一片漆黑时&#xff0c;不仅会打断我们的计划&#xff0c;还可能让我们感到无助和焦虑。电脑开不了机怎么办呢&#xff1f;如果你正面临这样的困境&#xff0c;别担心&#xff0c;本文将引导你通过三个简…

一文讲解:如何理解数字化?数字化的三大本质!

在当今时代&#xff0c;一些企业对数字化概念与本质进行了专门的诠释&#xff0c;部分认为数字化是基于大数据、云计算、物联网、5G等数字技术来实现企业的管理创新&#xff0c;且这一进程的前提是建立在信息化基础之上。然而&#xff0c;也有一些专家持有不同观点&#xff0c;…

基于weixin小程序新生报到系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;班级信息管理&#xff0c;师资力量管理&#xff0c;宿舍信息管理&#xff0c;宿舍安排管理&#xff0c;签到信息管理&#xff0c;论坛管理 小程序功能包括&#xff1a;系统首页&a…

用IP申请SSL证书需要注意什么?

用IP地址申请SSL证书需要选择支持IP地址验证的证书&#xff0c;验证所有权&#xff0c;正确安装和配置证书等。在互联网中&#xff0c;确保数据传输的安全性是至关重要的&#xff0c;使用SSL证书能够对数据进行加密处理&#xff0c;防止信息被窃取或篡改。使用IP地址申请SSL证书…

使用 Vanna 生成准确的 SQL 查询:工作原理和性能分析

Vanna工作原理 从本质上讲,Vanna 是一个 Python 包,它使用检索增强功能来帮助您使用 LLM 为数据库生成准确的 SQL 查询。 Vanna 的工作分为两个简单的步骤 - 在您的数据上训练 RAG“模型”,然后提出问题,这些问题将返回可设置为在您的数据库上自动运行的 SQL 查询。 vn.t…

如何安装Linux-centOS虚拟机

一、创建虚拟机 二、安装虚拟机 开启虚拟机&#xff0c;将光标移入虚拟机中&#xff0c;点击键盘上的上下键&#xff0c;移动到第一行&#xff0c;按下enter键&#xff0c;如图&#xff1a; 等待进入到如下图&#xff0c;选择中文 设置root密码

计算机毕业设计Thinkphp/Laravel校园体育器材管理系统

校园体育器材管理系统在流畅性&#xff0c;续航能力&#xff0c;等方方面面都有着很大的优势。这就意味着校园体育器材管理系统的设计可以比其他系统更为出色的能力&#xff0c;可以更高效的完成最新的体育器材、器材借用、器材归还、器材损坏、采购入库、器材报废、维修记录等…