基于ASP.NET实现验证码生成详解

下面我会详细讲解“基于ASP.NET实现验证码生成”的完整攻略。

什么是验证码(CAPTCHA)?

验证码(CAPTCHA),全称为 Completely Automated Public Turing test to tell Computers and Humans Apart,是一种用于区分计算机和人类的测试。一般用于抵御自动化的恶意攻击和垃圾信息。常见的验证码包括图像、声音、文字等形式。

用ASP.NET如何生成简单图形验证码?

在ASP.NET中,我们可以使用System.Drawing命名空间提供的Graphics类和Bitmap类,创建一个简单的图形验证码。下面是一个简单的ASP.NET页面,用于生成一个包含四位随机字符的图形验证码。

<%@ Page Language="C#" Debug="True" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Drawing" %>
<%@ Import Namespace="System.Drawing.Imaging" %>

<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        string captcha = RandomString(4);
        this.Session["captcha"] = captcha; //将验证码存入Session中,以便后续验证
        DrawImage(captcha);
    }

    protected void Page_Unload(object sender, EventArgs e)
    {
        //清除缓存
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.Cache.SetExpires(DateTime.Now);
        Response.Cache.SetNoStore();
    }

    //生成随机字符
    private string RandomString(int n)
    {
        string chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        Random rd = new Random();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < n; i++)
        {
            sb.Append(chars[rd.Next(chars.Length)]);
        }
        return sb.ToString();
    }

    //绘制图像
    private void DrawImage(string text)
    {
        Bitmap bmp = new Bitmap(100, 40);
        Graphics g = Graphics.FromImage(bmp);
        g.FillRectangle(Brushes.White, 0, 0, bmp.Width, bmp.Height);
        Font font = new Font("Arial", 24);
        Brush brush = new SolidBrush(Color.Black);
        g.DrawString(text, font, brush, 10, 5);
        MemoryStream ms = new MemoryStream();
        bmp.Save(ms, ImageFormat.Png);
        Response.ContentType = "image/png";
        Response.BinaryWrite(ms.ToArray());
        g.Dispose();
        bmp.Dispose();
    }
</script>

该页面的代码逻辑很简单,首先在Page_Load事件中生成一个包含四位随机字符的字符串,并将其存入Session中以便后续验证。然后利用Graphics类和Bitmap类绘制一个包含随机字符的图像,并将该图像以PNG格式输出给浏览器显示。同时,我们还在Page_Unload事件中清空缓存。

用ASP.NET如何实现基于字符的验证码?

基于字符的验证码,一般是将随机生成的字符绘制在图像上,并添加一些干扰线、干扰点等辅助图形,以增强验证码的识别难度。下面是一个基于字符的验证码生成示例代码。

<%@ Page Language="C#" Debug="True" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Drawing" %>
<%@ Import Namespace="System.Drawing.Imaging" %>

<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        string captcha = RandomString(4);
        this.Session["captcha"] = captcha;
        DrawImage(captcha);
    }

    protected void Page_Unload(object sender, EventArgs e)
    {
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.Cache.SetExpires(DateTime.Now);
        Response.Cache.SetNoStore();
    }

    private string RandomString(int n)
    {
        string chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        Random rd = new Random();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < n; i++)
        {
            sb.Append(chars[rd.Next(chars.Length)]);
        }
        return sb.ToString();
    }

    private void DrawImage(string text)
    {
        Bitmap bmp = new Bitmap(120, 50);
        Graphics g = Graphics.FromImage(bmp);
        g.Clear(Color.White);//清除画面,填充背景色

        Random rd = new Random(Guid.NewGuid().GetHashCode());//随机数产生器
        int randAngle = rd.Next(-45, 45);//随机转动角度
        float x = -18;
        float y = 0;
        for (int i = 0; i < text.Length; i++)
        {
            //绘制字符
            Font font = new Font("Arial", 30 + rd.Next(3), FontStyle.Bold);
            Brush brush = new SolidBrush(Color.FromArgb(rd.Next(0, 255), rd.Next(0, 255), rd.Next(0, 255)));
            g.RotateTransform(randAngle);//对字符进行角度旋转或倾斜
            g.DrawString(text[i].ToString(), font, brush, x + (i * 30), y);
            g.RotateTransform(-randAngle);//对字符进行反向旋转或倾斜

            //绘制干扰线
            Pen pen = new Pen(Color.Silver, 2);
            int x1 = rd.Next(bmp.Width);
            int y1 = rd.Next(bmp.Height);
            int x2 = rd.Next(bmp.Width);
            int y2 = rd.Next(bmp.Height);
            g.DrawLine(pen, x1, y1, x2, y2);

            //绘制干扰点
            pen = new Pen(Color.Gray, 2);
            for (int j = 0; j < 50; j++)
            {
                int x0 = rd.Next(bmp.Width);
                int y0 = rd.Next(bmp.Height);
                bmp.SetPixel(x0, y0, Color.FromArgb(rd.Next(0, 255), rd.Next(0, 255), rd.Next(0, 255)));
            }
        }

        MemoryStream ms = new MemoryStream();
        bmp.Save(ms, ImageFormat.Png);
        Response.ContentType = "image/png";
        Response.BinaryWrite(ms.ToArray());
        g.Dispose();
        bmp.Dispose();
    }
</script>

该页面的代码逻辑比较复杂,主要分为以下三个部分:

1.生成随机字符串:利用Random类产生指定长度的随机字符串。

2.生成验证码图片:使用Graphics类和Bitmap类绘制验证码图片。该过程主要可以分为绘制字符和绘制干扰线、干扰点两个部分。

3.输出验证码图片:利用Response对象将验证码图片输出到浏览器。

以上就是“基于ASP.NET实现验证码生成”的完整攻略,希望能对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于ASP.NET实现验证码生成详解 - Python技术站

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

相关文章

  • C#备忘录模式(Memento Pattern)实例教程

    C#备忘录模式(Memento Pattern)实例教程 备忘录模式(Memento Pattern)是一种行为型设计模式,它允许将一个对象的内部状态保存到一个外部的备忘录对象中,从而可以在需要时将对象恢复到先前的状态。在本篇教程中,我们将介绍C#中备忘录模式的使用方法和实现步骤,并提供两个示例说明。 示例一:备忘录模式的基本使用 步骤一:创建备忘录类 首先…

    C# 2023年6月8日
    00
  • C#下listview如何插入图片

    关于C#下listview如何插入图片,以下是详细攻略。 1. 添加图片列 首先我们需要在listview中添加一列,这一列用于存储图片。 listView1.Columns.Add("图片列", 80); 其中,”图片列”是列标题,80是列的宽度。为了方便,我们这里设置列宽为80。 2. 添加图片到列表项 接下来,我们需要添加图片到列表…

    C# 2023年6月6日
    00
  • .NET Core中RabbitMQ使用死信队列的实现

    针对“.NET Core中RabbitMQ使用死信队列的实现”这个话题,我将提供以下完整攻略步骤: 1. RabbitMQ死信队列基础概念 死信队列(Dead Letter Queue, DLQ)是一种特殊的队列,用于存储无法被消费者所处理的消息。当消息不能被正确地路由或消费者拒绝消费时,它们将会被投递到死信队列中。通常情况下,死信队列的作用是对失败的消息进…

    C# 2023年6月3日
    00
  • C#无损转换Image为Icon的方法

    下面我将为您详细讲解“C#无损转换Image为Icon的方法”的完整攻略。 介绍 首先,我们需要了解一下什么是ICO格式文件。ICO文件是Windows操作系统中图标的标准格式,它可以保存不同大小和颜色深度的图标。 在C#中,我们可以使用System.Drawing.Imaging命名空间中的Icon和IconInfo类来操作ICO文件。接下来,我将介绍如何…

    C# 2023年6月1日
    00
  • C#之继承实现

    C#之继承实现 什么是继承 继承是一种面向对象编程的基本特征,是指在一个类的基础上创建新类,新类具有原来类的特征(属性和方法),同时还能增加自己的特性。 通过继承,可以使代码的复用性大大提高,同时使得代码的管理和维护更方便。 在C#语言中,继承是通过使用关键字“:`”来实现的,子类继承父类。 继承的基本语法 class 子类名 : 父类名 { // 子类特有…

    C# 2023年6月6日
    00
  • C# Path.GetFileNameWithoutExtension(string path):获取指定路径的文件名(不包括扩展名)

    知识点讲解 Path.GetFileNameWithoutExtension(string path) 方法是 C# 中 Path 类的静态方法之一,这个方法的作用是获取指定路径下文件的文件名,但不包括扩展名。该方法的返回值类型是 string。 方法参数 Path.GetFileNameWithoutExtension() 方法只接受一个 string 类…

    C# 2023年4月19日
    00
  • C#实现简单的登录界面

    C#实现简单的登录界面攻略 总览 对于一个拥有用户注册和登录功能的网站而言,登录界面是不可或缺的。C#是一种广泛使用的编程语言,使得创建登录界面并实现各种用户验证变得相对容易。本篇攻略将向你展示如何使用C#实现一个简单的登录界面。 步骤 步骤一:创建项目 首先,我们需要创建一个新的C#项目。在Visual Studio中,选择“文件” -> “新建” …

    C# 2023年6月6日
    00
  • 详解如何在ASP.NET Core中使用Route特性

    详解如何在ASP.NET Core中使用Route特性 在ASP.NET Core中,Route特性是一种常用的路由技术,它可以帮助我们定义URL模式,将请求映射到相应的控制器和操作方法。本攻略将介绍如何在ASP.NET Core中使用Route特性,并提供两个示例说明。 使用Route特性 在ASP.NET Core中,我们可以使用Route特性来定义UR…

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