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#中的枚举(简明易懂) 在C#中,枚举是一种非常有效的机制来表示一组具有固定数量的离散值。本文将介绍在C#中使用枚举的概念、语法和示例。 概念 枚举是一个具有几个命名常量的数据类型。它是由相同类型的常量值组成的自定义数据类型。使用枚举可以增加代码的可读性,使代码更加容易维护和理解。 枚举的优点 使用枚举可以使代码更加自然。比如在我们日常生活中,一个星期…

    C# 2023年5月31日
    00
  • JavaScript获取table中某一列的值的方法

    当需要获取HTML中的表格内容时,常常需要处理表格中的某一列数据。下面,我们将详细讲解如何使用JavaScript获取HTML table中某一列的值的方法。 步骤 首先,我们需要先获取到HTML中的table元素,具体的代码如下所示: const table = document.querySelector(‘table’); 接下来,我们需要遍历每一行,…

    C# 2023年6月1日
    00
  • C# 泛型类(函数)的实例化小例子

    C# 提供了泛型类和泛型函数,它们可以适用于不同的数据类型,使代码更加灵活和可重用。本文将为大家详细介绍 C# 泛型类(函数)的实例化小例子。 泛型类的定义 泛型类是一种不特定的类,它能够适应许多不同类型的数据,具备以下语法结构: class 类名<T> { // 类的方法和属性代码 } 其中,T 是泛型类型参数,可以是任何标识符。通过这个参数,…

    C# 2023年6月8日
    00
  • 基于C#实现手机号码归属地接口调用

    基于C#实现手机号码归属地接口调用的完整攻略 手机号码归属地接口是一种常见的API接口,可以通过该接口查询手机号码的归属地信息。本文将提供一个基于C#实现手机号码归属地接口调用的完整攻略,包括两个示例。 步骤1:获取API接口 要使用手机号码归属地接口,首先需要获取API接口。可以在多个网站上找到提供手机号码归属地API接口的服务商。以下是一个示例: str…

    C# 2023年5月15日
    00
  • C# 中文简体转繁体实现代码

    针对您所提出的问题,我将为您提供一份针对C#中文简体转繁体实现的完整攻略。 1. 了解中文简体和繁体 中文的简体和繁体是两种不同的汉字书写方式,简体汉字主要在中国大陆地区和新加坡使用,而繁体汉字则主要在中国台湾、香港以及澳门等地区使用。因此,如果您的应用需要支持不同地区的用户并且需要涉及到中文的显示和输入,可能需要提供简繁转换的功能。 2. 简体转繁体的实现…

    C# 2023年6月7日
    00
  • C#将Unicode编码转换为汉字字符串的简单方法

    下面我将详细讲解“C#将Unicode编码转换为汉字字符串的简单方法”的完整攻略。 需求描述 在C#开发中,我们可能会遇到将Unicode编码转换成汉字字符串的需求。例如,我们从后端传递一个包含Unicode编码的字符串,前端需要将其转换成汉字显示出来。 解决方法 C#自带了对Unicode编码的解析和转换工具,我们可以直接使用System.Text.Reg…

    C# 2023年6月8日
    00
  • C#实现子类与父类的相互转换

    下面就为您详细讲解C#实现子类与父类的相互转换的完整攻略。 1. 概述 C#中,子类与父类之间的相互转换可以通过以下两种方式实现: 子类对象可以直接转换为父类对象,称为向上转型(upcasting)。 父类对象也可以转换为子类对象,称为向下转型(downcasting)。 2. 向上转型 向上转型是比较简单的,因为子类对象中包含了父类对象的所有属性和方法。所…

    C# 2023年5月15日
    00
  • C#中数组初始化与数组元素复制的方法

    C#中数组初始化与数组元素复制的方法主要有以下几种: 一、使用数组初始化语法 数组初始化语法在C# 3.0中引入,允许我们在声明数组时使用大括号来初始化数组元素,语法格式如下: type[] arrayName = {element1, element2, element3, …, elementN}; 其中,type为数组元素类型,arrayName为…

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