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日

相关文章

  • C#中值类型和引用类型的区别深度分析

    C#中值类型和引用类型的区别深度分析 什么是值类型和引用类型? 在C#中,数据类型分为值类型和引用类型两种。 值类型具有以下特点: 存储在栈上; 直接保存值本身; 复制操作是值的拷贝。 而引用类型则具有以下特点: 存储在堆上; 存储的是指向数据的内存地址,即引用; 复制操作只是复制了引用,不是复制数据本身。 如果一个变量存储的是值类型数据,则该变量直接保存具…

    C# 2023年5月15日
    00
  • C#算法之大牛生小牛的问题高效解决方法

    C#算法之大牛生小牛的问题高效解决方法 问题描述 题目来源于 LeetCode,现在有一只大牛和一只小牛,它们的初始体重分别为 $x$ 和 $y$,每年它们的体重都会增加固定的比例(比例为 $p$),求当小牛的体重超过大牛的体重时,需要多少年。 解题思路 考虑使用循环解决。 每年大牛的体重增加 $p$%,小牛的体重增加 $2p$%,那么循环条件可以设为小牛体…

    C# 2023年6月7日
    00
  • C#利用反射实现多数据库访问

    C#利用反射实现多数据库访问的完整攻略指的是使用C#编程语言,通过反射技术实现对多种不同的数据库的访问操作。在开发过程中,我们可以针对不同的数据库类型编写不同的代码。下面是整个过程的具体步骤: 添加必要的引用和命名空间:在使用反射进行数据库访问操作之前,我们需要在引用中添加 System.Reflection 和 System.Data 命名空间。添加这些命…

    C# 2023年6月1日
    00
  • .net设计模式之装饰模式(Decorator)

    当我们需要在不改变原有类的情况下对其进行新功能添加或修改时,装饰模式是一种适用的设计模式。它允许向一个现有对象添加新的功能,同时又不改变其结构。该模式是一种结构性模式。 装饰模式(Decorator)的基本结构 装饰模式有四个角色: 抽象构建(Component):定义一个对象接口,可以给这些对象动态地添加职责。 具体构建(ConcreteComponent…

    C# 2023年6月3日
    00
  • C#在winform中实现数据增删改查等功能

    让我来为你讲解“C#在Winform中实现数据增删改查等功能”的完整攻略及两个示例。 一、引言: Winform 是操作系统 Windows 操作界面的一种扩展————当开发人员需要创建 Windows 应用程序,它是基于 .NET 平台构建的,扮演着桥梁的角色。使用 C# 在 Winform 中实现数据增删改查等功能,我们可以通过 Visual Studi…

    C# 2023年6月1日
    00
  • C#Process的OutputDataReceived事件不触发问题及解决

    首先需要说明的是,C#中的Process类可以用于启动和管理外部进程,包括可以获取该进程的标准输出流等信息。然而,有时候我们会遇到Process类中OutputDataReceived事件不触发的问题,也就是说并不能获取到进程的标准输出流信息。 出现这个问题的原因有多种,比如: 进程的输出缓冲区被填满; 进程输出数据流的标准输出缓冲区不存在; 异步读取操作运…

    C# 2023年6月6日
    00
  • ASP.NET Core中使用Redis实现缓存

    ASP.NET Core中使用Redis实现缓存 在ASP.NET Core应用程序中,缓存是一项非常重要的任务,它可以帮助您提高应用程序的性能和可扩展性。Redis是一种流行的缓存工具,它可以帮助我们管理和缓存数据。在本攻略中,我们将详细讲解如何使用Redis实现缓存,并提供两个示例说明。 步骤一:安装Redis 要使用Redis实现缓存,您需要先安装Re…

    C# 2023年5月17日
    00
  • C#实现顺序栈和链栈的代码实例

    C#实现顺序栈和链栈的代码实例可以分成以下几个步骤: 第一步:定义栈的数据结构 在C#中,我们可以使用class或者struct定义一个栈的数据结构。在这里,我们以class为例,定义一个名为Stack的类: public class Stack<T> { private T[] _items; private int _count; publi…

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