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#实现根据字节数截取字符串并加上省略号的方法

    当我们需要在页面上展示一篇文章标题或者一段文字时,经常会遇到字数过多的情况。这时候我们可以使用 C# 实现的截取字符串的方法来实现并在尾部加上省略号,提高用户体验。 下面是实现的完整攻略: 1.确定要截取的字节数 首先需要确定截取的字节数。这里需要注意的是一个汉字在 utf-8 编码下占用三个字节,而在 gb2312/GBK 编码下占用两个字节。因此我们需要…

    C# 2023年6月8日
    00
  • springMVC+velocity实现仿Datatables局部刷新分页方法

    我们将使用SpringMVC和Velocity作为模板引擎来实现仿Datatables局部刷新分页的功能。以下是详细的步骤: 第一步:配置SpringMVC 为了使用SpringMVC,我们需要添加如下依赖: <dependency> <groupId>org.springframework</groupId> <a…

    C# 2023年5月31日
    00
  • c#图片上传和显示的实现方法

    C# 图片上传和显示是 Web 开发中的常见需求。本文将介绍 C# 图片上传和显示的实现方法。 图片上传 图片上传需要使用 HTML 的 form 表单和服务器端的代码处理。以下是实现图片上传的基本步骤: HTML Form 表单中添加 <input type=”file” name=”image”>,用于选择要上传的图片文件。 在服务器端,使用…

    C# 2023年5月15日
    00
  • C# 基于NAudio实现对Wav音频文件剪切(限PCM格式)

    下面是详细讲解如何使用C#和NAudio库来实现对Wav音频文件的剪切操作。 1. 准备工作 在开始之前,需要先准备好以下工作: 安装.NET开发环境(建议使用Visual Studio,下载地址:https://visualstudio.microsoft.com/zh-hans/downloads/); 安装NAudio库(可以使用NuGet进行安装,或…

    C# 2023年6月1日
    00
  • 时间轻松学会.NET Core操作ElasticSearch7的方法

    时间轻松学会.NET Core操作ElasticSearch7的方法 ElasticSearch是一个流行的开源搜索引擎,它可以帮助我们在大规模数据集中进行高效的搜索和分析。本攻略将详细介绍如何在.NET Core中使用ElasticSearch7,并提供两个示例说明。 安装ElasticSearch7 在开始使用ElasticSearch7之前,我们需要先…

    C# 2023年5月16日
    00
  • 解析C#的扩展方法

    以下是解析C#的扩展方法的完整攻略: 什么是C#的扩展方法? C#的扩展方法是一种特殊的静态方法,可以向已存在的类添加新的方法。使用扩展方法可以使已经封装好的类变得更加灵活,方便开发者自定义其功能。 如何定义扩展方法? 定义扩展方法需要以下几个要素: 扩展方法必须被定义在静态类中。 扩展方法必须使用this关键字作为方法的第一个参数,表示需要扩展的类型。 扩…

    C# 2023年5月15日
    00
  • C和Java没那么香了,Serverless时代Rust即将称王?

    C和Java没那么香了,Serverless时代Rust即将称王? 什么是Serverless? Serverless是一种计算模型,开发者无需操心服务器资源的预配置、扩缩容等操作,只需编写业务逻辑代码,并通过特定平台触发运行。它成为现代云计算架构中的一个趋势。 Rust为何具有Serverless优势? Rust是一门系统级编程语言,可以提供高效、低成本的…

    C# 2023年6月6日
    00
  • 浅解关于C#多线程的介绍

    下面我将为您详细讲解“浅解关于C#多线程的介绍”的完整攻略。 什么是多线程 在计算机科学中,多线程是指程序中包含多个执行线程的计算机程序执行模型的能力。这些线程可以并发执行,并在需要时协调共享资源以避免与另一个线程的冲突。 C#是一门拥有强大多线程支持的编程语言。C#的多线程功能旨在提高应用程序的性能和可伸缩性。 如何使用多线程 C#多线程可以采用多种方式实…

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