基于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日

相关文章

  • 如何用WindowsForm给窗口添加一些简单的动画效果

    下面是如何用WindowsForm给窗口添加一些简单的动画效果的完整攻略: 1. 使用Timer控件实现简单动画效果 在WindowsForm应用程序中,可以使用Timer控件来实现简单的动画效果。下面给出一个使用Timer控件实现移动矩形的例子。 首先,在WindowsForm应用程序中添加一个矩形(可以使用Panel控件进行实现),然后添加一个Timer…

    C# 2023年6月6日
    00
  • C#中HttpClient使用注意(预热与长连接)

    C#中HttpClient使用注意(预热与长连接) 在使用HttpClient时需要注意两个方面的问题:预热和长连接。本文将详细讲解这两方面的注意事项和实现方法。 预热 预热是指提前对HttpClient进行初始化,并使其保持一段时间的生命周期,以减少后续的请求延迟。一般来说,在使用HttpClient的应用中,HttpClient实例的创建、初始化和销毁都…

    C# 2023年6月6日
    00
  • C#中的队列Queue与堆栈Stack

    下面是关于C#中的队列Queue与堆栈Stack的完整攻略。 栈和队列是什么? 栈(Stack)是一种有序的数据集合,新添加的或待删除的元素都保存移位顶部,称作栈顶,而现有的元素都在栈底。这种操作叫做LIFO(Last in First Out,后进先出)。栈的应用极为广泛,如比较好的表达中缀表达式、进行函数调用和返回数据等操作。 队列(Queue)是一种有…

    C# 2023年5月31日
    00
  • C#实现对象的序列化和反序列化

    C#实现对象的序列化和反序列化 在C#中,我们可以使用对象的序列化和反序列化将对象转换为字节流,并将其保存到文件中或发送到网络。在本文中,我们将介绍如何使用C#实现对象的序列化和反序列化。 什么是对象序列化? 序列化是指将一个对象转换为字节流的过程。序列化后的对象可以保存在文件中或通过网络发送。当我们需要在不同的应用程序或服务器之间传输数据时,序列化是一种非…

    C# 2023年5月31日
    00
  • [译]在C#中使用IComparable和IComparer接口

    原文:Use the IComparable and IComparer interfaces in Visual CSharp 本文介绍了在Visual C#中如何使用IComparer和IComparable接口。 概要 本文同时讨论了IComparable和IComparer接口,原因有两点。这两个接口经常一起使用。虽然接口类似且名称相似,但它们却有不…

    C# 2023年5月3日
    00
  • Sqlserver 2005使用XML一次更新多条记录的方法

    SQL Server 2005可以利用XML实现一次更新多条记录的操作。以下是步骤的详细说明和示例。 步骤一:创建存储过程 首先,需要创建一个存储过程来实现在SQL Server 2005中使用XML一次更新多条记录的操作。 CREATE PROCEDURE UpdateMultipleRecords @XMLData XML AS BEGIN –1.创建…

    C# 2023年6月8日
    00
  • C#实现读取DataSet数据并显示在ListView控件中的方法

    C#实现读取DataSet数据并显示在ListView控件中的方法 1. 创建DataSet对象并添加DataTable 首先,需要创建一个DataSet对象并添加一个或多个DataTable对象,来存储需要读取的数据。示例代码如下: DataSet dataSet = new DataSet(); DataTable table = new DataTab…

    C# 2023年6月7日
    00
  • C#内存管理CLR深入讲解(上篇)

    C#内存管理CLR深入讲解(上篇) 概述 本文主要介绍C#中的CLR内存管理机制,包括垃圾回收机制、对象生命周期、Finalizer和托管堆等。C#作为一门托管语言,由CLR负责管理内存,以确保程序的稳定性和性能。 垃圾回收 垃圾回收机制是CLR的核心功能之一,它通过监控对象的使用情况,自动清理无用的对象,回收内存资源。在C#中,开发者无需手动管理内存,而是…

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