C#生成漂亮验证码完整代码类

开发C#生成漂亮验证码的完整攻略可以包括如下几个方面:

1.添加NuGet包

首先要讲解的是,我们需要在项目中添加一个NuGet包来生成验证码。在Visual Studio中,可以通过依次单击“工具”>“NuGet包管理器”>“管理解决方案的NuGet包”来打开NuGet包管理器。然后搜索“ZKWeb.System.Drawing”包并安装它。

2.创建验证码生成类

接下来我们需要创建一个名为“CaptchaHelper”的类。这个类需要定义以下三个公共方法:

public byte[] GenerateCaptcha(string captchaText);
public bool ValidateCaptcha(string captchaText, string captchaCode);
public void ClearExpiredCaptcha();

GenerateCaptcha方法用于生成验证码,参数“captchaText”用于设置验证码文本。

ValidateCaptcha方法用于验证验证码是否正确,参数“captchaText”用于指定验证文本,“captchaCode”用于指定验证码编码。

ClearExpiredCaptcha方法用于清除过期的验证码。

3.实现验证码生成和验证逻辑

在CaptchaHelper类中,代码如下:

public class CaptchaModel
{
    public string CaptchaCode { get; set; }
    public DateTime ExpireTime { get; set; }
}

public class CaptchaHelper
{
    private static readonly IDictionary<string, CaptchaModel> CaptchaDic = new Dictionary<string, CaptchaModel>();

    public byte[] GenerateCaptcha(string captchaText)
    {
        // 生成验证码图片
        Image captchaImg = GenerateCaptchaImage(captchaText);

        // 将图片转换成字节数组
        byte[] imageBytes;
        using (var ms = new MemoryStream())
        {
            captchaImg.Save(ms, ImageFormat.Png);
            ms.Seek(0, SeekOrigin.Begin);
            imageBytes = ms.ToArray();
        }

        // 保存验证码
        string captchaId = Guid.NewGuid().ToString("N");
        var captchaModel = new CaptchaModel
        {
            CaptchaCode = captchaText,
            ExpireTime = DateTime.Now.AddMinutes(5)
        };
        CaptchaDic[captchaId] = captchaModel;

        return imageBytes;
    }

    public bool ValidateCaptcha(string captchaText, string captchaCode)
    {
        // 判断验证码是否过期或已经验证过
        var captchaModel = CaptchaDic.Values.FirstOrDefault(cm => cm.CaptchaCode == captchaText && DateTime.Now < cm.ExpireTime);
        if (captchaModel == null)
        {
            return false;
        }

        // 删除已验证过的验证码
        CaptchaDic.Remove(CaptchaDic.First(d => d.Value == captchaModel).Key);
        return captchaModel.CaptchaCode.ToLowerInvariant() == captchaCode.ToLowerInvariant();
    }

    public void ClearExpiredCaptcha()
    {
        var expiredCaptchaList = CaptchaDic.Values.Where(cm => DateTime.Now >= cm.ExpireTime).ToList();
        foreach (var captchaModel in expiredCaptchaList)
        {
            CaptchaDic.Remove(CaptchaDic.First(d => d.Value == captchaModel).Key);
        }
    }

    private Image GenerateCaptchaImage(string captchaText)
    {
        // 创建一个位图并设置大小
        var bmp = new Bitmap(130, 40);

        // 创建一个画布对象
        var g = Graphics.FromImage(bmp);

        // 绘制验证码背景图案
        g.Clear(Color.White);
        Random rand = new Random();
        for (int i = 0; i < 10; i++)
        {
            int x1 = rand.Next(bmp.Width / 2);
            int y1 = rand.Next(bmp.Height);
            int x2 = rand.Next(bmp.Width / 2, bmp.Width);
            int y2 = rand.Next(bmp.Height);
            g.DrawLine(Pens.LightGray, x1, y1, x2, y2);
        }

        // 绘制验证码文本
        Brush brush = new LinearGradientBrush(new Rectangle(0, 0, bmp.Width, bmp.Height), Color.DarkBlue, Color.DarkRed, 1.0f);
        g.DrawString(captchaText, new Font("Microsoft Yahei", 20), brush, new PointF(0, 0));

        // 添加干扰点和干扰线
        for (int i = 0; i < 100; i++)
        {
            int x = rand.Next(bmp.Width);
            int y = rand.Next(bmp.Height);
            bmp.SetPixel(x, y, Color.FromArgb(rand.Next()));
        }

        for (int i = 0; i < 10; i++)
        {
            int x1 = rand.Next(bmp.Width);
            int y1 = rand.Next(bmp.Height);
            int x2 = rand.Next(bmp.Width);
            int y2 = rand.Next(bmp.Height);
            g.DrawLine(Pens.LightGray, x1, y1, x2, y2);
        }

        return bmp;
    }
}

CaptchaModel类是一个验证码的实体类,包含验证码的代码和过期时间。

GenerateCaptcha方法通过调用GenerateCaptchaImage方法生成验证码图片,将验证码图片转换为字节流,并将验证码信息存入字典中。

ValidateCaptcha方法根据传入的验证文本和验证码编码,判断验证码是否正确。如果过期或验证过,则返回false。

ClearExpiredCaptcha方法用于清除过期的验证码。

GenerateCaptchaImage方法用于生成验证码图片,包括绘制背景图案、绘制验证码文本和添加干扰点和干扰线。

4.测试验证码生成和验证

在Web应用程序中,调用GenerateCaptcha方法生成验证码图片,将验证码图片返回到浏览器,并将验证码代码存储在Session或Cookie中,以便后续的验证。

在验证码输入页面中,用户输入验证码后,调用ValidateCaptcha方法进行验证。如果验证码正确,则允许用户执行后续操作。

例如,在ASP.NET Core中,可以编写如下代码:

生成验证码:

[HttpGet]
public IActionResult CaptchaImage()
{
    string captchaText = "ABCD1234";
    byte[] imageData = new CaptchaHelper().GenerateCaptcha(captchaText);
    HttpContext.Session.SetString("CaptchaText", captchaText);
    return File(imageData, "image/png");
}

验证验证码:

[HttpPost]
public IActionResult Submit(string captchaCode)
{
    string captchaText = HttpContext.Session.GetString("CaptchaText");
    bool isCaptchaValid = new CaptchaHelper().ValidateCaptcha(captchaText, captchaCode);
    if (isCaptchaValid)
    {
        // 验证成功
        return RedirectToAction("Success");
    }
    else
    {
        // 验证失败
        return RedirectToAction("Error");
    }
}

以上是验证码生成和验证的例子。具体实现方式可以根据需求做出调整。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#生成漂亮验证码完整代码类 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • C# FileAttributes.Archive:表示文件为归档文件

    FileAttributes.Archive方法的作用与使用方法 作用 在C#语言中,FileAttributes.Archive方法是用来获取或设置文件(或文件夹)的归档属性的。在计算机领域中,归档属性通常被用于标识哪些文件需要备份或复制,或者已经被备份或复制过。当我们修改或者创建一个文件时,系统会自动将该文件的归档属性置为“归档”(Archive)。也就…

    C# 2023年4月19日
    00
  • c#创建Graphics对象的三种方法

    让我们来详细讲解一下c#创建Graphics对象的三种方法。 前言 在C#中,我们可以使用Graphics对象来进行图形绘制操作,比如绘制直线、矩形、椭圆、多边形等。Graphics对象通常与平面控件(如PictureBox和Panel)配合使用,通过将图像绘制到控件上来实现绘制功能。那么在C#中,有哪些方法可以创建Graphics对象呢? 创建Graphi…

    C# 2023年6月1日
    00
  • 详解C#中委托的概念与使用

    详解C#中委托的概念与使用 委托的概念 委托是一种类型,它可以用于封装方法、函数或Lambda表达式,并将其作为参数传递给其他方法。委托可以理解为是一个函数指针,它指向一个特定的方法。 委托是一个类,定义了一个方法的签名,可以指向任何函数,只要这个函数的参数列表和返回值类型与该委托的签名相同。C#中的委托必须先声明后使用,声明委托格式如下: delegate…

    C# 2023年6月7日
    00
  • C#实现类似新浪微博长URL转短地址的方法

    下面是C#实现类似新浪微博长URL转短地址的方法的攻略: 1. 获取长URL的短地址 在.NET中,可以使用第三方库RestSharp发送HTTP请求,将长URL转换为短地址。 新浪微博开放了自己的短地址服务,使用时需要去官网申请API接口,获得App Key和App Secret。 在代码中,使用RestSharp的RestClient对象发送HTTP请求…

    C# 2023年5月31日
    00
  • C#结合AForge实现摄像头录像

    C#结合AForge实现摄像头录像攻略 本攻略将详细讲解如何使用C#和AForge库实现摄像头录像功能。 准备工作 在开始编写代码之前,您需要准备以下环境和工具: C#编程环境 AForge.NET库 AForge.NET库简介 AForge.NET是一个开源的计算机视觉和人工智能框架,支持图像处理、视频处理、人脸识别、机器学习等功能。在本文中,我们将使用其…

    C# 2023年6月3日
    00
  • c#中LINQ的基本用法(一)

    首先我们来介绍一下“c#中LINQ的基本用法(一)”的完整攻略。本篇攻略将介绍LINQ的基础概念和语法。 什么是LINQ? LINQ(Language Integrated Query,语言集成查询)是一种结合了面向对象程序设计思想和关系数据库思想的查询技术。它允许使用类似SQL的语言(比如C#)来查询数据,既可以查询集合类型的数据,也可以查询数据库中的数据…

    C# 2023年6月1日
    00
  • C#中is和as用法实例分析

    C#中is和as用法实例分析 is关键字 is关键字是用来判断某个对象是否是指定类型的实例,如果是则返回true,否则返回false。语法格式如下: obj is type 其中obj表示需要判断的对象,type表示需要判断的类型。如果obj是type类型的实例,返回true,否则返回false。 示例1:判断对象是否是某个类型的实例 object obj …

    C# 2023年5月15日
    00
  • c#异步操作后台运行(backgroundworker类)示例

    下面我将详细讲解“C#异步操作后台运行(BackgroundWorker类)示例”的完整攻略,包括背景和示例说明: 背景 在C#开发中,我们经常会遇到需要在后台执行一些任务的情况,比如上传或下载文件、对大量数据进行计算和处理等。为了避免出现界面卡顿或者无响应的情况,我们往往采用异步操作来实现后台运行。 C#中提供了BackgroundWorker类来实现异步…

    C# 2023年6月1日
    00
合作推广
合作推广
分享本页
返回顶部