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# 多线程与跨线程访问界面控件的方法完整攻略: 1. C# 多线程基础 在 C# 中,多线程的基本实现是通过 System.Threading 命名空间下的类来实现的。常用的类有: Thread:表示一个单独的线程。 ThreadPool:表示一个线程池,它包含了多个预先创建的线程。 Task:表示一个异步操作。 下面展示一个创建并运行线程的示例代…

    C# 2023年6月7日
    00
  • C#中Convert.ToDecimal()报错问题的解决

    下面我将详细讲解“C#中Convert.ToDecimal()报错问题的解决”的完整攻略,包含以下几个部分: 问题描述 原因分析 解决方法 示例演示 1. 问题描述 在C#中使用Convert.ToDecimal()方法将字符串转为十进制数时,有时候会遇到报错的情况,具体错误信息如下: System.FormatException: 字符串“str”格式不正…

    C# 2023年5月15日
    00
  • .NET1.0版本中的异步编程模型(APM)

    .NET 1.0版本中的异步编程模型(APM) 在 .NET 1.0 版本中,使用异步编程模型(Async Programming Model,APM)可以轻松实现异步操作,其主要思想是通过非阻塞式编程模型来提高程序性能和响应时间。通过将耗时操作放入单独的线程中,并在处理完成后通知调用线程,提高了程序并发性和响应时间。 异步编程模型的基本组成部分 异步编程模…

    C# 2023年6月3日
    00
  • Unity3D摄像机跟随小球移动而不旋转的设置方法

    让我们来讲解一下“Unity3D摄像机跟随小球移动而不旋转的设置方法”,以下是具体的步骤: 步骤一:创建一个场景 首先,在Unity编辑器中创建一个新场景,然后创建一个小球和一个摄像机。将小球放在场景中央,并将摄像机放在适当的位置来拍摄小球。 步骤二:设置摄像机位置和旋转 接下来,我们需要将摄像机的位置和旋转设置为固定的。具体步骤如下: 找到摄像机组件Ins…

    C# 2023年6月3日
    00
  • C# 常量 结构体 委托

    常量 const double PI = 3.1415926; 常量名命名一般使用大写字母 枚举类型 开发一个游戏,游戏角色有法师(Mage)、射手(Archer)、刺客(Assassin)、坦克(Tank)、铺助(Support)、战士(Warrior),等不同类型。 ❓如何存储游戏角色 使用int类型 :创建一套规则,提前为各个类型角色绑定一个数字标识 …

    C# 2023年5月2日
    00
  • 关于C#连接SQL Server时提示用户登录失败的解决方法

    下面就是关于C#连接SQLServer时提示用户登录失败的解决方法的完整攻略: 1. 检查用户名和密码是否正确 第一步,你应该检查你提供的用户名和密码是否正确。在C#中,利用SqlConnectionStringBuilder类创建连接字符串,其中包括用户名和密码信息。示例代码如下: SqlConnectionStringBuilder builder = …

    C# 2023年5月14日
    00
  • C#基于SQLiteHelper类似SqlHelper类实现存取Sqlite数据库的方法

    一、背景介绍SQLite是一个轻量级的关系型数据库,具有体积小,速度快,操作简便,易于集成等优点,在嵌入式设备,移动设备及桌面应用程序等方面得到广泛使用。C#语言作为一个跨平台的编程语言,在各个领域的应用也十分广泛,同时也提供了SQLite数据库的连接方式,提供SQLite连接C#的API。虽然C#提供了一些SQLite的API,但是操作SQLite数据库仍…

    C# 2023年5月31日
    00
  • C#基础之异步调用实例教程

    C#基础之异步调用实例教程 本篇教程旨在介绍基于C#异步调用相关知识的实例,帮助初学者了解如何利用异步调用提高程序的并发处理能力和性能。 异步调用的概念和优势 异步调用的核心是多线程并发处理。在进行某些耗时操作时,使用异步调用可以使主线程不需要等待操作完成,而可以继续执行其他操作。一般来说,异步调用可优化的操作包括网络请求、数据库请求、文件读写等等。 异步调…

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