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日

相关文章

  • 探讨如何配置SQL2008,让其允许C#远程外部连接的方法详解

    探讨如何配置SQL2008,让其允许C#远程外部连接的方法: 配置SQL2008的网络设置 打开”SQL Server Configuration Manager”,选择 “SQL Server Network Configuration”,然后选择SQL Server服务的名称。 选择 “TCP/IP” 选项卡。 若TCP/IP未启用,则右键选择 “TCP…

    C# 2023年6月2日
    00
  • C# Pointer指针应用实例简述

    C# Pointer指针应用实例简述 在C#语言中,指针(Pointer)是一个非常重要的概念,它可以让我们高效地进行内存操作。本文将简单介绍指针的基本概念,并通过两个应用实例说明指针的具体操作方法。 指针的基本概念 指针是一个变量,它存储着另一个变量的内存地址。在C#中,通过使用关键字“unsafe”来开启指针使用的权限。同时,为了增加运行时的安全性,C#…

    C# 2023年5月31日
    00
  • C# 正则表达式进阶

    C# 正则表达式进阶攻略 引言 正则表达式是一种强大的字符匹配工具,可以在文本数据中快速查找、替换满足特定模式的文本。在 C# 中,使用正则表达式可以通过 System.Text.RegularExpressions 命名空间的类实现。本文将详细讲解如何进阶应用 C# 正则表达式,包括贪婪与懒惰匹配、断言、捕获组、回溯引用等。 贪婪与懒惰匹配 正则表达式默认…

    C# 2023年6月3日
    00
  • C#在Unity游戏开发中进行多线程编程的方法

    C#在Unity游戏开发中进行多线程编程的方法 在Unity游戏开发中,多线程编程可以提高游戏性能和可玩性,让游戏更加流畅。而在C#中,我们可以使用Thread类来进行多线程编程。 使用Thread类进行多线程编程 Thread类是.NET中用于创建和管理线程的类。在Unity游戏开发中,我们可以使用它来创建和管理多线程。 创建线程 创建线程有两种方式,一种…

    C# 2023年5月15日
    00
  • C#调用接口的四种方式介绍

    下面我将详细讲解“C#调用接口的四种方式介绍”。 1. 接口介绍 接口是一种特殊的类,它只包含成员函数的声明而没有实现,也不包含数据成员。通过接口可以定义一种协议,并按照这个协议来编写类。接口可以被多个类同时实现,并且可以通过接口的引用来调用这些实现。 2. 接口的定义 C# 中定义接口的语法格式如下: interface 接口名称 { 返回值类型 函数名(…

    C# 2023年5月31日
    00
  • C#中Lambda表达式的三种写法

    下面我将为你讲解C#中Lambda表达式的三种写法的完整攻略。 1. 简单Lambda表达式 在C#中,我们可以使用Lambda表达式来简化匿名方法的编写。Lambda表达式有三个部分组成:参数列表、箭头(Lambda符号)和Lambda方法体,在下面的例子中,我们使用Lambda表达式实现了一个简单的加法方法: int Add(int a, int b) …

    C# 2023年6月1日
    00
  • C#四舍五入MidpointRounding.AwayFromZero解析

    C#四舍五入MidpointRounding.AwayFromZero解析 在C#中,Math.Round()方法可以用于数字四舍五入。在使用此方法时,你可以选择使用MidpointRounding.AwayFromZero枚举,确定如何处理中间值。下面我们将详细讲解MidpointRounding.AwayFromZero的使用和示例。 什么是Midpoi…

    C# 2023年6月7日
    00
  • C#支付宝扫码支付代码完整版

    C#支付宝扫码支付代码完整版详解 作为网站作者,今天我来为大家详细讲解“C#支付宝扫码支付代码完整版”的完整攻略。我们将会探讨如何在C#语言环境下,使用支付宝扫码支付。 前置知识 在开始探讨代码之前,我们需要了解几个基本的概念和相关部件: 支付宝开放平台(Alipay Open Platform):支付宝提供的用于接入其开放API的第三方平台。 支付宝开放平…

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