netcore 生成验证码

安装依赖

Install-Package Lazy.Captcha.Core

注册服务

builder.Services.AddCaptcha();

自定义注册服务

// 注册服务的时候增加配置
services.AddCaptcha(Configuration, option =>
{
    option.CaptchaType = CaptchaType.WORD; // 验证码类型
    option.CodeLength = 6; // 验证码长度, 要放在CaptchaType设置后.  当类型为算术表达式时,长度代表操作的个数
    option.ExpirySeconds = 30; // 验证码过期时间
    option.IgnoreCase = true; // 比较时是否忽略大小写
    option.StoreageKeyPrefix = ""; // 存储键前缀

    option.ImageOption.Animation = true; // 是否启用动画
    option.ImageOption.FrameDelay = 30; // 每帧延迟,Animation=true时有效, 默认30

    option.ImageOption.Width = 150; // 验证码宽度
    option.ImageOption.Height = 50; // 验证码高度
    option.ImageOption.BackgroundColor = SkiaSharp.SKColors.White; // 验证码背景色

    option.ImageOption.BubbleCount = 2; // 气泡数量
    option.ImageOption.BubbleMinRadius = 5; // 气泡最小半径
    option.ImageOption.BubbleMaxRadius = 15; // 气泡最大半径
    option.ImageOption.BubbleThickness = 1; // 气泡边沿厚度

    option.ImageOption.InterferenceLineCount = 2; // 干扰线数量

    option.ImageOption.FontSize = 36; // 字体大小
    option.ImageOption.FontFamily = DefaultFontFamilys.Instance.Actionj; // 字体

    /* 
        * 中文使用kaiti,其他字符可根据喜好设置(可能部分转字符会出现绘制不出的情况)。
        * 当验证码类型为“ARITHMETIC”时,不要使用“Ransom”字体。(运算符和等号绘制不出来)
        */

    option.ImageOption.TextBold = true;// 粗体,该配置2.0.3新增
});

提供一个生成验证码和校验的接口

    /// <summary>
    /// 生成验证码
    /// </summary>
    /// <param name="id"></param>
    /// <returns></returns>
    [HttpGet]
    public IActionResult Captcha(string id)
    {
        var info = _captcha.Generate(id);
        // 有多处验证码且过期时间不一样,可传第二个参数覆盖默认配置。
        //var info = _captcha.Generate(id,120);
        var stream = new MemoryStream(info.Bytes);
        return File(stream, "image/gif");
    }
    /// <summary>
    /// 验证验证码是否输入正确
    /// </summary>
    [HttpGet]
    public bool Validate(string id, string code)
    {
        return _captcha.Validate(id, code);
    }

前端部分


<div class="text-center">
    <img id="captchaImage" src="" alt="Captcha Image" />
    <input type="text" id="captchaInput" placeholder="Enter the captcha code" />
    <button id="validateButton">Validate</button>
    <div id="resultMessage"></div>
</div>
<script>
    document.addEventListener('DOMContentLoaded', function () {
        var guid = generateUUIDv4();
        // 加载验证码图片
        loadCaptcha();

        // 监听验证按钮点击事件
        document.getElementById('validateButton').addEventListener('click', validateCaptcha);
        // 点击图片刷新验证码
        document.getElementById('captchaImage').addEventListener('click', captchaImageClick);

        async function captchaImageClick() {
            //刷新GUID
            guid = generateUUIDv4();
            // 重新加载验证码
            loadCaptcha();
        } 
        async function loadCaptcha() {
            try {
                const response = await fetch('/home/Captcha?id=' + guid);
                const blob = await response.blob();
                const imageUrl = URL.createObjectURL(blob);
                document.getElementById('captchaImage').src = imageUrl;
            } catch (error) {
                console.error('Failed to load captcha:', error);
            }
        } 
        async function validateCaptcha() {
            const input = document.getElementById('captchaInput').value;
            const response = await fetch('/home/Validate?id=' + guid + "&code=" + input);

            const data = await response.json();
            const messageElement = document.getElementById('resultMessage');

            if (data) {
                messageElement.textContent = 'Captcha is correct!';
                messageElement.style.color = 'green';
            } else {
                messageElement.textContent = 'Incorrect captcha. Please try again.';
                messageElement.style.color = 'red';
                //刷新GUID
                guid = generateUUIDv4();
                // 重新加载验证码
                loadCaptcha();
            }
        } 
        function generateUUIDv4() {
            return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
                var r = Math.random() * 16 | 0,
                    v = c === 'x' ? r : (r & 0x3 | 0x8);
                return v.toString(16);
            });
        }
    }); 
</script>

代码地址:GitHub - maoyuan6/verificationcode: 验证码

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

广州化工厂可燃气体报警器检定检验:安全生产新举措显成效

随着科技的不断发展&#xff0c;可燃气体报警器的检定检验技术也在不断进步。 广州的一些化工厂开始采用先进的智能检测系统和数据分析技术&#xff0c;对报警器的性能进行更加精准和全面的评估。 这些新技术不仅能够提高检定检验的效率和准确性&#xff0c;还能够为化工厂的…

Python测试框架--Allure

严格意义上讲 Allure 不算是测试框架&#xff0c;但是它是生成漂亮测试报告的开源工具&#xff0c;搭配 Pytest 测试框架食用更搭。 也就是说 Allure 是在 Pytest 执行完生成的测试数据的基础上&#xff0c;对测试数据进行处理统计&#xff0c;生成格式统一、美观的测试报告。 …

Java中OOP的概念及示例

Java中OOP的概念及示例 在本指南中&#xff0c;您将学习Java中的OOP概念。面向对象编程系统&#xff08;OOP&#xff09;是一种基于“对象”的编程概念。面向对象编程的主要目的是提高程序的可读性、灵活性和可维护性。 面向对象编程将数据及其行为集中在一个称为对象的实体中…

反射机制详解

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a;Java从入门到精通 ✨特色专栏&#xff…

XSS+CSRF组合拳

目录 简介 如何进行实战 进入后台创建一个新用户进行接口分析 构造注入代码 寻找XSS漏洞并注入 小结 简介 &#xff08;案例中将使用cms靶场来进行演示&#xff09; 在实战中CSRF利用条件十分苛刻&#xff0c;因为我们需要让受害者点击我们的恶意请求不是一件容易的事情…

企业为什么要进行数据资产管理工作:价值与案例剖析

在数字化浪潮席卷全球的今天&#xff0c;数据已经成为企业不可或缺的重要资产。数据资产管理&#xff0c;作为确保数据资产价值得以最大化利用的关键环节&#xff0c;正逐渐成为企业战略规划中的核心议题。本文将深入剖析企业进行数据资产管理工作的必要性&#xff0c;并结合实…

[YOLOv10:注意力机制的轻量化创新,MLCA在目标检测中的卓越表现]

本文改进:一种轻量级的Mixed Local Channel Attention (MLCA)模块,该模块考虑通道信息和空间信息,并结合局部信息和全局信息以提高网络的表达效果。 1.YOLOv10介绍 论文:[https://arxiv.org/pdf/2405.14458] 代码: https://gitcode.com/THU-MIG/yolov10?utm_source=csdn…

Visual Studio2022+cuda环境配置及代码调试

环境配置 下载并安装CUDA Toolkit 打开Visual Studio&#xff0c;新建项目。如下图所示&#xff0c;已经包含CUDA编程选项 代码调试 1、打开cu文件的属性页&#xff0c;按下图所示&#xff0c;将Host中的Generate Host Debug Information设置为“是" 2、不可勾选Nsight…

塑造化工行业新格局:探索无锡哲讯智能化定制ERP系统的关键特点

在当今科技迅猛发展的时代背景下&#xff0c;化工行业面临着前所未有的机遇与挑战。传统的管理模式已经难以满足企业日益增长的需求&#xff0c;而企业资源规划&#xff08;ERP&#xff09;系统的引入&#xff0c;为化工行业带来了全新的变革。无锡哲讯&#xff0c;作为行业领先…

如何防止三重勒索勒索软件?

您的数据被加密后&#xff0c;定期备份数据是一个很好的策略&#xff0c;可以避免支付赎金&#xff0c;但这并不意味着攻击者仍然无法占得上风。一些攻击者现在正转向三重勒索勒索软件攻击&#xff0c;扬言不仅要劫持您的数据&#xff0c;还要将这些信息泄露给公众。 这类勒索…

ffmpeg的安装教程

1.官网下载ffmpeg 进入Download FFmpeg网址&#xff0c;点击下载windows版ffmpeg&#xff08;点击左下第一个绿色的行&#xff09; 在release builds第一个绿框里面选择一个版本下载。 2.配置 下载完成后解压该压缩包单击进入ffmpeg\bin&#xff0c;会出现如下界面&#xff1…

Linux驱动开发(二)--字符设备驱动开发提升 LED驱动开发实验

1、地址映射 在编写驱动之前&#xff0c;需要知道MMU&#xff0c;也就是内存管理单元&#xff0c;在老版本的 Linux 中要求处理器必须有 MMU&#xff0c;但是现在Linux 内核已经支持无 MMU 的处理器了。 MMU的功能如下&#xff1a; 完成虚拟空间到物理空间的映射 内存保护&…

瑞尼克RNK聚四氟乙烯注射器刻度清晰纯净

四氟注射器用于抽取或者注入气体或者液体&#xff0c;四氟注射器由前端带有小孔的针筒以及与之匹配的活塞芯杆组成&#xff0c;用来将少量的液体或其注入到其它方法无法接近的区域或者从那些地方抽出&#xff0c;在芯杆拔出的时候液体或者气体从针筒前端小孔吸入&#xff0c;在…

0.5 逐行扫描(Progressive scan)简介

0.5 逐行扫描简介 逐行扫描&#xff08;Progressive scan&#xff09;是一种将图像显示在扫描式的显示设备上的方法。 逐行扫描常被用在计算机显示器上。 逐行扫描按照从左到右&#xff0c;从上到下的顺序扫描图像的所有行。如下图&#xff1a; 下图粗略的将逐行扫描与隔行…

思科PAP命令笔记

命令格式 含义 版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 原文链接&#xff1a;https://blog.csdn.net/qq_44862120/article/details/115675197 ——————…

ssh远程连接vps

打开ssh服务 sudo vi /etc/ssh/sshd_config查看是否好了 systemctl status sshd生成ssh私钥 生成在C:\Users\baozhongqi\.ssh 然后可以用自己密码登录或者用私钥登录 密码登录 ssh私钥登录 我使用的是tabby tabby下载 setup是Windows使用的版本 如果这样子不能ssh链接只能…

【管理咨询宝藏131】麦肯锡波士顿贝恩经典战略咨询报告套装

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏131】麦肯锡波士顿贝恩经典战略咨询报告套装 【格式】PDF版本 【关键词】麦肯锡、波士顿咨询、贝恩咨询、战略咨询、战略落地、战略洞察 【强烈…

【深度学习】 探讨Stable Diffusion模型的训练及其偏向性

探讨Stable Diffusion模型的训练及其偏向性 近年来&#xff0c;生成式模型在图像生成领域取得了显著进展&#xff0c;特别是Stable Diffusion模型。作为一种基于扩散过程的生成模型&#xff0c;Stable Diffusion模型展现了生成高质量图像的巨大潜力。然而&#xff0c;与所有机…

队列(数据结构篇)

数据结构之队列 队列(queue) 概念&#xff1a; 队列也是一种线性表&#xff0c;使用队列时插入在一端进行而删除则在另一端进行&#xff0c;队列的基本操作是入队&#xff0c;它是在表的末端(也叫做队尾)插入一个元素&#xff0c;出队&#xff0c;它是删除在**表的开头(**队…