asp.net 验证码的简单制作(vb.net+C#)

一、 关于验证码
验证码是因为防止机器恶意注册而被广泛应用的技术。下面是使用ASP.NET在VB.NET和C#中实现的样例代码。

二、步骤

  1. 添加ASP.NET Web页面

    • 首先,添加一个新的ASP.NET页面,指定网址,如“~/CheckCode.aspx” ,最好确保您设置为不得缓存页面。这个页面将会生成验证码的图片并直接输出。
  2. 创建验证码

    • 使用Bitmap类处理验证码图片,使用Graphics类在Bitmap对象中创建图像。
  3. 增加允许字符

    • 在生成验证码图片之前,您需要预定义一个包含所有允许字符的字符串常量,例如:“ABCDEFGHJKLMNPQRSTUVWXYZ23456789”。
    • 注意:不包含“I”和“O”字符,因为它们容易与数字1和0混淆。
  4. 添加干扰线

    • 这样可以使图片更复杂、更难以被机器识别。
    • 使用坐标随机数生成代码,在Bitmap对象中创建干扰线。
  5. 添加点位置

    • 往往需要将干扰点加入图片中。
  6. 创建一个随机字符

    • 每次生成验证码,都需要使用一个随机字符,调用Random.Next()方法获取不重复的随机数。
  7. 清除其他信息

    • 在输出图像之前,您需要清除其他信息。
  8. 输出验证码图片

    • 最后,使用Response.OutputStream将您的验证码图像输出到客户端。

三、VB.NET示例代码

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load
    Dim strCodes As String = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789" ' 验证码可能包含的字符
    Dim strFont As String = "Verdana" ' 字体
    Dim intWidth As Integer = 90 ' 图片宽度
    Dim intHeight As Integer = 20 ' 图片高度
    Dim intFontSize As Integer = 17 ' 字体大小
    Dim intMaxLength As Integer = 4 ' 验证码长度 '
    Dim strRandomCode As String = String.Empty 
    Dim rnd As New Random() ' 随机生成器 

    Dim img As New Bitmap(intWidth, intHeight)
    Dim g As Graphics = Graphics.FromImage(img)
    Dim font As New Font(strFont, intFontSize, FontStyle.Bold)

    ' 填充背景
    g.Clear(Color.White)

    ' 排列验证码中的字符
    For i As Integer = 0 To intMaxLength - 1
        Dim strCurrChar As String = strCodes.Substring(rnd.Next(0, strCodes.Length - 1), 1)
        strRandomCode = String.Concat(strRandomCode, strCurrChar)
        Dim x As Integer = i * (intWidth \ intMaxLength)
        Dim rndX As Integer = x + rnd.Next((intWidth \ intMaxLength) \ 2, (intWidth \ intMaxLength) - 10)
        Dim rndY As Integer = rnd.Next(5, intHeight - intFontSize - 5)
        ' 在绘画画布上输出字符
        g.DrawString(strCurrChar, font, New SolidBrush(Color.Black), rndX, rndY, New StringFormat())
    Next

    '添加干扰线
    For i As Integer = 0 To 4
        Dim x1 As Integer = rnd.Next(intWidth)
        Dim x2 As Integer = rnd.Next(intWidth)
        Dim y1 As Integer = rnd.Next(intHeight)
        Dim y2 As Integer = rnd.Next(intHeight)
        g.DrawLine(New Pen(Color.Black), x1, y1, x2, y2)
    Next

    ' 添加干扰点位
    For i As Integer = 0 To 50
        Dim x As Integer = rnd.Next(intWidth)
        Dim y As Integer = rnd.Next(intHeight)
        img.SetPixel(x, y, Color.FromArgb(rnd.Next()))
    Next

    ' 输出图片
    Response.Cache.SetCacheability(HttpCacheability.NoCache)
    Response.ContentType = "image/jpeg"
    Dim ms As New MemoryStream()
    img.Save(ms, ImageFormat.Jpeg)
    Response.BinaryWrite(ms.ToArray())
    g.Dispose()
    img.Dispose()
End Sub

四、C#示例代码


protected void Page_Load(object sender, EventArgs e)
{
    string strCodes = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789";
    string strFont = "Verdana";
    int intWidth = 90;
    int intHeight = 20;
    int intFontSize = 17;
    int intMaxLength = 4;
    string strRandomCode = String.Empty;
    Random rnd = new Random();

    Bitmap img = new Bitmap(intWidth, intHeight);
    Graphics gdi = Graphics.FromImage(img);
    Font font = new Font(strFont, intFontSize, FontStyle.Bold);

    //填充背景
    gdi.Clear(Color.White);

    //绘画验证码字符
    for (int i = 0; i < intMaxLength; i++)
    {
        string strCurrChar = strCodes.Substring(rnd.Next(0, strCodes.Length - 1), 1);
        strRandomCode = String.Concat(strRandomCode, strCurrChar);
        int x = i * (intWidth / intMaxLength);
        int rndX = x + rnd.Next((intWidth / intMaxLength) / 2, (intWidth / intMaxLength) - 10);
        int rndY = rnd.Next(5, intHeight - intFontSize - 5);
        // 在绘画画布上输出字符
        gdi.DrawString(strCurrChar, font, new SolidBrush(Color.Black), rndX, rndY, new StringFormat());
    }

    //添加随机干扰线
    for (int i = 0; i < 4; i++)
    {
        int x1 = rnd.Next(intWidth);
        int x2 = rnd.Next(intWidth);
        int y1 = rnd.Next(intHeight);
        int y2 = rnd.Next(intHeight);
        gdi.DrawLine(new Pen(Color.Black), x1, y1, x2, y2);
    }

    // 添加随机干扰点
    for (int i = 0; i < 50; i++)
    {
        int x = rnd.Next(intWidth);
        int y = rnd.Next(intHeight);
        img.SetPixel(x, y, Color.FromArgb(rnd.Next()));
    }

    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Response.ContentType = "image/jpeg";
    MemoryStream ms = new MemoryStream();
    img.Save(ms, ImageFormat.Jpeg);
    Response.BinaryWrite(ms.ToArray());
    gdi.Dispose();
    img.Dispose();
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:asp.net 验证码的简单制作(vb.net+C#) - Python技术站

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

相关文章

  • C#与C++枚举的区别对比和使用案例

    C#与C++枚举的区别对比和使用案例 枚举在C#和C++的基本定义 C#和C++中的枚举都是一组具有相同数据类型的常量。枚举定义的基本语法如下: C#: enum 枚举名称 { 枚举常量1, 枚举常量2, … } C++: enum 枚举名称 { 枚举常量1, 枚举常量2, … }; 在定义枚举时,常量的默认值从0开始自动递增。也可以给特定的枚举常量…

    C# 2023年5月15日
    00
  • C#泛型详解及关键字作用

    C#泛型详解及关键字作用 泛型的介绍 C#泛型是一个高度灵活且强大的特性,能够让我们编写具有通用性的代码。在不加使用泛型的情况下,我们需要对不同类型的数据写出不同的代码。而使用了泛型之后,我们可以编写出更加通用的代码,同时减少了代码的重复,增强了代码的可重用性。 泛型类别通常用于集合类库,因为集合类库只处理与它们分别正在处理的元素类型无关的逻辑。 泛型的语法…

    C# 2023年6月1日
    00
  • C# 如何合并和拆分PDF文件

    针对这个问题,我可以给你提供以下完整攻略: 前置要求 在进行C#合并和拆分PDF文件之前,我们需要先安装iTextSharp这个C# PDF处理库。你可以使用NuGet下载并安装iTextSharp,或者直接在Visual Studio中通过“引用”菜单添加对应的dll文件。 合并PDF文件 如果需要合并多个PDF文件,可以采取如下步骤进行处理: 第一步:新…

    C# 2023年6月6日
    00
  • ASP.NET实现的生成验证码功能示例【附demo源码】

    下面我会详细讲解“ASP.NET实现的生成验证码功能示例【附demo源码】”的完整攻略。 1. 简介 验证码(CAPTCHA)是为了防止垃圾邮件、洪水攻击等恶意攻击而被广泛采用的技术。本示例演示了如何使用ASP.NET实现一个生成验证码图片的功能,并在提交表单时对验证码进行验证。 2. 实现步骤 2.1 生成验证码图片 在ASP.NET中,通过使用Graph…

    C# 2023年6月1日
    00
  • C# 使用Aspose.Cells 导出Excel的步骤及问题记录

    下面是详细讲解“C# 使用Aspose.Cells 导出Excel的步骤及问题记录”的完整攻略。 1. Aspose.Cells 是什么 Aspose.Cells 是一个 .NET 组件库,用于处理 Microsoft Excel 文件,包括创建、读取、修改和导出 Excel 文件。Aspose.Cells 提供了广泛的 API 功能,可以通过代码轻松地将 …

    C# 2023年5月31日
    00
  • asp.net 数字签名实例代码

    为了实现数字签名,我们需要使用ASP.NET自带的RSACryptoServiceProvider类。该类可以生成密钥对,对消息进行数字签名,以及验证数字签名。下面是实现数字签名的详细步骤: 步骤一:生成密钥对 首先,我们需要生成一个RSA密钥对,用于数字签名。我们可以使用以下代码生成密钥对: // 创建一个RSA实例 using (var rsa = ne…

    C# 2023年5月31日
    00
  • Visual Studio Connected Services 生成http api 调用代码

    生成的代码将和接口对应的参数、返回值一一对应,本文底层使用的工具为NSwag.exe,其他可替代的方案还有AutoSet.exe。本文中生成的代码将在编译过程中自动编译,类似grpc生成代码的模式,如果使用AutoSet则需要手动引入代码。另外也可以使用NSwag对应的vs插件(https://marketplace.visualstudio.com/ite…

    C# 2023年5月11日
    00
  • CommunityToolkit.Mvvm8.1 viewmodel源生成器写法(3)

      本系列文章导航 https://www.cnblogs.com/aierong/p/17300066.html https://github.com/aierong/WpfDemo (自我Demo地址) 希望提到的知识对您有所提示,同时欢迎交流和指正 作者:aierong出处:https://www.cnblogs.com/aierong   说明 Co…

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