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# 语言实现关键字过滤的功能。 步骤一:准备关键字列表 首先,我们需要准备一个包含关键字列表的文件,该文件中每一行包含一个关键字。例如,我们可以创建一个名为 “keywords.txt” 的文本文件,包含以下内容: 色情…

    C# 2023年6月7日
    00
  • c# 钩子学习笔记

    C#钩子学习笔记 什么是钩子 Windows操作系统为我们提供了许多钩子(Hooks),如键盘钩子、鼠标钩子、Windows消息钩子、时间戳钩子等。钩子可以让我们在系统层面对各种事件消息进行拦截、监控、修改或者定制化输出等操作。 钩子的分类 Windows中的钩子有很多种,我们可以将它们大体分为两类: 系统钩子 (system-wide hook):作用于整…

    C# 2023年5月15日
    00
  • wpf RelativeSource绑定

    RelativeSource有四种类型 Self FindAncestor TemplatedParent PreviousData   a.Self Self用于绑定源和绑定目标相同的场景中。对象的一个属性与同一对象的另一个属性绑定。 例如,让我们取一个高度和宽度相同的椭圆。在XAML文件中添加下面给出的代码。宽度属性与高度属性相对绑定。 <Grid…

    C# 2023年4月18日
    00
  • asp.net GridView 删除时弹出确认对话框(包括内容提示)

    下面是关于“asp.net GridView 删除时弹出确认对话框(包括内容提示)”的完整攻略: 一、需求 我们需要在一个asp.net GridView中删除数据时,弹出确认对话框,同时包含内容提示,确保用户明确知道正在进行的操作。 二、实现步骤 1.在GridView中添加删除按钮。 在GridView的模板列中,添加一个“删除”按钮,并设置Comman…

    C# 2023年6月1日
    00
  • Unity实现俄罗斯方块(二)

    Unity实现俄罗斯方块(二)攻略 1. 前言 在上一篇文章《Unity实现俄罗斯方块(一)》中,我们实现了俄罗斯方块游戏的基本框架,包括生成指定形状的方块、方块下落、方块旋转、消行等基本功能。接下来,我们在这个基础上,继续实现俄罗斯方块游戏的其他功能,包括左右移动和加速下落。 下面,我们就一步一步来详细讲解如何实现这些功能。 2. 左右移动 在俄罗斯方块游…

    C# 2023年6月1日
    00
  • C#中Override关键字和New关键字的用法详解

    在C#中,Override关键字和New关键字都用于重写父类成员。但是,它们的用法和效果有所不同。本文将详细介绍Override关键字和New关键字的用法和区别。 Override关键字 Override关键字用于重写父类的虚方法或抽象方法。以下是一个示例: class Animal { public virtual void Speak() { Conso…

    C# 2023年5月15日
    00
  • C#实现绘制鼠标的示例代码

    下面是“C#实现绘制鼠标的示例代码”的完整攻略: 1. 准备工作 在开始编写代码之前,需要安装好Visual Studio并打开一个新的C#项目。可以选择Windows Form App或者Console App等应用类型,具体根据需要而定。接下来可以按照下面的步骤来实现绘制鼠标的功能。 2. 引用命名空间 在代码文件的顶部引用System.Drawing命…

    C# 2023年6月6日
    00
  • C++中const的实现细节介绍(C,C#同理)

    下面是关于C++中const的实现细节介绍的完整攻略。 const的含义和作用 C++中的const常量表示一个不可改变的变量,即该变量的值不允许被修改。const常量通常用于定义程序中不会改变的数据,例如PI的值。const的作用相当于定义了一个只读的变量。 const的定义和初始化 const常量可以在定义时被初始化,也可以在后面进行初始化。 定义时初始…

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