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# 中实现ftp 图片上传功能(多快好省)

    下面是在C#中实现ftp图片上传功能的完整攻略。 1. 确定FTP服务器信息 在进行FTP图片上传之前,首先需要确定FTP服务器的相关信息,如FTP服务器的地址、端口、用户名、密码等。这些信息一般由FTP服务器的管理员提供,在使用FTP客户端工具时也需要输入。 2. 引入FTP操作组件 在C#中实现FTP操作,需要使用FTP操作组件。常用的FTP操作组件有F…

    C# 2023年5月15日
    00
  • c# 复写Equals方法的实现

    下面详细讲解如何复写 C# 中的 Equals 方法。 1. 什么是 Equals 方法 在 C# 中,查看任何对象是否相等时,我们可以使用 Equals 方法。Equals 方法是一个虚方法,它是 Object 类的一部分,也就是说,所有的类都继承自 Object 类并从中继承了 Equals 方法。 默认实现是比较两个对象的引用,如果它们引用相同的对象,…

    C# 2023年6月1日
    00
  • ASP.NET Core MVC 从入门到精通之HttpContext

    随着技术的发展,ASP.NET Core MVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容,适用于初学者,在校毕业生,或其他想从事ASP.NET Core MVC 系统开发的人员。 经过前几篇文章的讲解,初步了解ASP.NET Core MVC项目创建,启…

    C# 2023年5月7日
    00
  • C#中使用DataContractSerializer类实现深拷贝操作示例

    下面是关于“C#中使用DataContractSerializer类实现深拷贝操作示例”的完整攻略: 1. 什么是深拷贝? 深拷贝和浅拷贝是常用的两种对象复制方式。 浅拷贝指的是对于某个对象,只复制其基本类型数据(比如int、float、string等),而将其引用类型数据(比如对象)的引用复制给新对象。 深拷贝则是对某个对象进行复制时,将其引用类型数据也一…

    C# 2023年5月31日
    00
  • C#事件订阅发布实现原理详解

    C#事件订阅发布实现原理详解 一、事件订阅发布机制简介 事件是C#中最常用的一种机制之一,它可以将对象之间的通信极大地简化和解耦。订阅和发布是事件发生的关键步骤,其中订阅(或称为注册)表示一个对象准备接收来自另一个对象(即发布者)的通知,而发布(或称为引发)则表示对象触发了一个事件并向订阅该事件的其他对象发送通知。 在C#中,此机制通过event关键字来实现…

    C# 2023年6月6日
    00
  • C#中委托用法实例详解

    下面是详细讲解“C#中委托用法实例详解”: 什么是委托 委托是一种类型,它可以用于封装对方法的引用。简单来说,委托就是存储了方法的对象,可以像对待方法一样对待它并向它传递参数。在C#中,使用委托可以大大简化回调函数,具有非常强的灵活性。 如何声明委托 使用delegate关键字可以声明一个委托,如下所示: delegate void MyDelegate(i…

    C# 2023年6月7日
    00
  • 提高C# StringBuilder操作性能优化的方法

    提高C# StringBuilder操作性能优化的方法 前言 StringBuilder是C#语言中常用的字符串操作类之一,用于对字符串进行动态操作,比如追加、替换、插入等。在进行大量字符串操作时,使用StringBuilder可以提高性能,而不必像使用字符串拼接时那样频繁创建和销毁字符串对象。但是,如果使用不得当,StringBuilder也可能出现性能问…

    C# 2023年6月8日
    00
  • asp.net中oracle 存储过程(图文)

    下面我将详细讲解“ASP.NET 中 Oracle 存储过程”的完整攻略。 一、背景介绍 在使用ASP.NET框架进行Web应用程序开发的过程中,我们通常需要调用Oracle数据库的存储过程来获取数据或者对数据进行修改操作。而存储过程相比于单纯的SQL语句执行,能更好地提高数据库性能,同时还能提高代码实现的安全性。 因此,掌握ASP.NET中Oracle存储…

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