Asp.net(C#)实现验证码功能代码

接下来我将为您详细讲解Asp.net(C#)实现验证码功能代码的完整攻略。

1. 简介

验证码,就是为了防止恶意机器人向网站提交请求或恶意注册而设计的一种验证方法。通过验证码,网站可以判断请求来源的真实性并提高安全性。

2. 实现过程

首先,我们需要生成一个随机的验证码,并将其显示在前台;其次,用户需要输入验证码并进行验证。下面,我将分两部分进行详细讲解。

2.1 生成验证码

我们可以使用Asp.net的GDI+图像处理功能生成验证码。具体方法如下:

public void ShowValidateCode()
{
    string validateCode = GenerateCheckCode();
    HttpContext.Current.Session["CheckCode"] = validateCode;
    System.Drawing.Bitmap image = new System.Drawing.Bitmap((int)Math.Ceiling((validateCode.Length * 12.5)), 22);
    System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(image);
    try
    {
        Random random = new Random();
        g.Clear(Color.White);
        for (int i = 0; i < 25; i++)
        {
            int x1 = random.Next(image.Width);
            int x2 = random.Next(image.Width);
            int y1 = random.Next(image.Height);
            int y2 = random.Next(image.Height);
            g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
        }
        Font font = new Font("Arial", 12, (System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic));
        System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, true);
        g.DrawString(validateCode, font, brush, 2, 2);
        for (int i = 0; i < 100; i++)
        {
            int x = random.Next(image.Width);
            int y = random.Next(image.Height);
            image.SetPixel(x, y, Color.FromArgb(random.Next()));
        }
        g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
        MemoryStream ms = new MemoryStream();
        image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
        HttpContext.Current.Response.ClearContent();
        HttpContext.Current.Response.ContentType = "image/Gif";
        HttpContext.Current.Response.BinaryWrite(ms.ToArray());
    }
    finally
    {
        g.Dispose();
        image.Dispose();
    }
}

在以上代码中,我们首先生成一个随机的验证码,并将其存储到Session中以备后续验证使用。接下来,我们创建一个图像对象,使用GDI+绘制出验证码,并在绘制时使用了拉伸渐变的效果,增强了验证码的识别难度。最后使用MemoryStream存储图像,并发送给前台。

2.2 验证输入

在前台,用户会输入验证码并提交到后台验证,我们需要进行验证码的比较。具体方法如下:

if (Session["CheckCode"] == null || string.IsNullOrEmpty(Session["CheckCode"].ToString().Trim()))
{
    //验证码已经失效,请重新获取
}
else if (string.Compare(Session["CheckCode"].ToString(), chkCode.Trim(), true) != 0)
{
    //验证码输入错误,请重新输入
}
else
{
    //验证通过
}

在以上代码中,我们首先判断Session中是否存在验证码的值,如果不存在则说明验证码已经失效,需要重新获取;如果存在,则将用户输入的值和Session中存储的值进行比较,如果比较不一致,则说明输入错误,需要重新输入;如果比较一致,则说明验证通过。

3. 示例说明

下面,我将给出两个代码示例以展示以上的实现过程。

3.1 C#示例

protected void Page_Load(object sender, EventArgs e)
{
    ShowValidateCode();
}

protected void btnSubmit_Click(object sender, EventArgs e)
{
    if (Session["CheckCode"] == null || string.IsNullOrEmpty(Session["CheckCode"].ToString().Trim()))
    {
        Response.Write("<script>alert('验证码已经失效,请重新获取')</script>");
    }
    else if (string.Compare(Session["CheckCode"].ToString(), txtCode.Text.Trim(), true) != 0)
    {
        Response.Write("<script>alert('验证码输入错误,请重新输入')</script>");
    }
    else
    {
        Response.Write("<script>alert('验证通过')</script>");
    }
}

public void ShowValidateCode()
{
    string validateCode = GenerateCheckCode();
    Session["CheckCode"] = validateCode;
    System.Drawing.Bitmap image = new System.Drawing.Bitmap((int)Math.Ceiling((validateCode.Length * 12.5)), 22);
    System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(image);
    try
    {
        Random random = new Random();
        g.Clear(Color.White);
        for (int i = 0; i < 25; i++)
        {
            int x1 = random.Next(image.Width);
            int x2 = random.Next(image.Width);
            int y1 = random.Next(image.Height);
            int y2 = random.Next(image.Height);
            g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
        }
        Font font = new Font("Arial", 12, (System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic));
        System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, true);
        g.DrawString(validateCode, font, brush, 2, 2);
        for (int i = 0; i < 100; i++)
        {
            int x = random.Next(image.Width);
            int y = random.Next(image.Height);
            image.SetPixel(x, y, Color.FromArgb(random.Next()));
        }
        g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
        MemoryStream ms = new MemoryStream();
        image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
        Response.ClearContent();
        Response.ContentType = "image/Gif";
        Response.BinaryWrite(ms.ToArray());
    }
    finally
    {
        g.Dispose();
        image.Dispose();
    }
}

private string GenerateCheckCode()
{
    char[] chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
    StringBuilder sb = new StringBuilder();
    Random random = new Random();
    for (int i = 0; i < 4; i++)
    {
        int index = random.Next(chars.Length);
        sb.Append(chars[index]);
    }
    return sb.ToString();
}

以上示例展示了一套完整的验证码实现过程,包含了验证码的生成和比较,可以直接在项目中进行使用。

3.2 HTML和JavaScript示例

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>验证码示例</title>
    <script type="text/javascript">
        function refresh() {
            document.getElementById("imgCode").src = "ValidateCode.ashx?" + Math.random();
        }
        function validate() {
            var code = document.getElementById("txtCode").value;
            if (code == "") {
                alert("请输入验证码!");
                return false;
            }
            else {
                //向后台请求,验证验证码
                return true;
            }
        }
    </script>
</head>
<body>
    <form action="#" method="post" onsubmit="return validate()">
        <p>请输入验证码:<input type="text" id="txtCode" /><img id="imgCode" src="ValidateCode.ashx" style="cursor: pointer;" onclick="refresh()" /></p>
        <p><input type="submit" value="提交" /></p>
    </form>
</body>
</html>

以上示例展示了一个HTML页面及其附带的JavaScript代码,包含了验证码的显示和刷新以及输入的验证,可以直接在Web开发中进行使用。

4. 总结

以上,就是Asp.net(C#)实现验证码功能代码的完整攻略。通过以上的实现过程,我们可以更好地加强网站的安全性,防止恶意攻击。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Asp.net(C#)实现验证码功能代码 - Python技术站

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

相关文章

  • .NET Core 2.0迁移小技巧之web.config 配置文件示例详解

    首先,我们需要了解什么是“.NET Core”和“web.config”配置文件。”.NET Core” 是一个跨平台的,开源的框架,它使用了不同的部署配置来提高性能。而“web.config”文件是.NET框架中的配置文件,它用于配置ASP.NET应用程序的各个方面,包括Web服务器设置、应用程序设置等。接下来我们会详细讲解如何迁移“.NET Core 2…

    C# 2023年6月3日
    00
  • WPF实现文本描边+外发光效果的示例代码

    WPF(Windows Presentation Foundation)是一种用于创建Windows桌面应用程序的技术。WPF提供了丰富的UI元素和效果,可以轻松实现文本描边和外发光效果。本文将提供WPF实现文本描边和外发光效果的完整攻略,包括创建WPF应用程序、实现文本描边、实现外发光效果、示例等。 创建WPF应用程序 要创建WPF应用程序,可以使用Vis…

    C# 2023年5月15日
    00
  • C#使用Aspose.Cells创建和读取Excel文件

    使用Aspose.Cells创建和读取Excel文件可以通过以下步骤实现: 1.下载和安装Aspose.Cells Aspose.Cells可以从官网下载并安装。 2.创建一个新的工作簿并添加工作表 using Aspose.Cells; // 创建一个新的工作簿 Workbook workbook = new Workbook(); // 在工作簿中添加一…

    C# 2023年5月31日
    00
  • C#隐式/显示实现接口方法详解

    C#隐式/显示实现接口方法详解 在 C# 中,接口是构建松散耦合系统的一种有用的机制。类可以继承自多个接口,并根据需要实现这些接口的方法。 当类实现多个接口并且这些接口拥有同样的方法名称时,我们需要使用隐式或显示接口实现,以解决命名冲突和实现特定接口的方法的问题。下面将详细讲解 C# 中的隐式和显示实现接口方法。 隐式实现接口方法 为了实现一个接口方法,类所…

    C# 2023年5月15日
    00
  • c#中多线程访问winform控件的若干问题小结

    下面我将详细讲解“C# 中多线程访问 WinForm 控件的若干问题小结”的完整攻略,共分以下几个部分: 背景介绍 多线程访问 WinForm 控件的若干问题 不同环境对多线程访问 WinForm 控件的影响 解决多线程访问 WinForm 控件的若干方法 示例 1. 背景介绍 在进行 Windows 程序开发时,我们经常需要使用 C# 和 WinForm …

    C# 2023年5月15日
    00
  • Asp.net treeview实现无限级树实现代码

    下面是关于”Asp.net TreeView实现无限级树实现代码”的完整攻略。 介绍 TreeView是Asp.net Web Forms中常用的一种控件,可以用于构建树形结构的网页菜单或目录。本文将介绍如何使用TreeView控件实现无限级树形菜单,并提供两个示例说明。 步骤 1. 准备数据源 为了构建无限级树形菜单,我们需要一个能够支持无限级别嵌套的数据…

    C# 2023年5月31日
    00
  • C# 多线程处理List数据的示例代码

    我们来详细讲解一下“C# 多线程处理List数据的示例代码”的完整攻略吧。 1. 理解多线程处理List数据的必要性 在C#中,当需要处理大量数据时,多线程是提高程序效率的一种好方式,特别是在处理大规模的数据集合时,利用多线程可以缩短程序处理时间,提高程序的执行效率。 2. 实现多线程处理List数据的示例代码 下面我们来看一下实现多线程处理List数据的示…

    C# 2023年6月6日
    00
  • C#创建不规则窗体的4种方式详解

    C#创建不规则窗体的4种方式详解 简介 标准的窗体一般都是矩形,但是有时候我们可能需要创建一个不规则的窗体。本文将详细介绍C#创建不规则窗体的4种方式,并通过代码示例来演示。 方式一:使用无边框窗体并设置圆角 使用Form控件创建一个无边框窗体,然后通过设置圆角使其看起来像是一个不规则窗体。下面是一个简单的示例: public partial class I…

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