ASP.NET中的无刷新验证码的开发(完整代码)

下面我将详细讲解ASP.NET中的无刷新验证码的开发,包括完整代码和示例说明。

环境准备

在开始开发之前,需要准备好以下环境:
- Visual Studio 2019
- .NET Framework 4.6.1或以上版本
- jQuery库

实现流程

本篇攻略中的无刷新验证码,是通过使用jQuery和ASP.NET的Web服务技术实现的。具体的实现流程如下:

1. 生成验证码图片

首先,需要生成随机的验证码图片以供用户识别。可以使用以下方式来生成验证码图片:

public void GenerateCaptchaImage(string captchaCode)
{
    Bitmap image = new Bitmap(80, 30);
    Graphics graphics = Graphics.FromImage(image);
    graphics.Clear(Color.White);

    // 绘制验证码
    graphics.DrawString(captchaCode, new Font("Arial", 16), Brushes.Black, new PointF(5, 5));

    // 绘制噪点
    Random random = new Random();
    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()));
    }

    // 绘制边框
    graphics.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);

    // 输出图片
    MemoryStream memoryStream = new MemoryStream();
    image.Save(memoryStream, ImageFormat.Png);
    Response.ClearContent();
    Response.ContentType = "image/png";
    Response.BinaryWrite(memoryStream.ToArray());
}

2. 生成随机验证码

然后,需要生成一个随机的验证码字符串,以供上一步生成图片时使用。可以使用以下方式来生成随机的验证码字符串:

public string GenerateCaptchaCode()
{
    string captchaCode = "";
    var random = new Random();
    for (int i = 0; i < 5; i++)
    {
        captchaCode += (char)('a' + random.Next(0, 26));
    }
    return captchaCode;
}

3. 调用Web服务获取验证码

接下来,前端页面通过Ajax调用Web服务获取验证码图片的URL和验证码字符串:

function getCaptcha() {
    $.ajax({
        url: '/CaptchaWebService.asmx/GetCaptcha',
        type: 'POST',
        dataType: 'json',
        success: function (data) {
            $("#captchaImg").attr("src", data.ImageUrl);
            $("#captchaCode").val(data.CaptchaCode);
        },
        error: function (xhr, statusText, errorThrown) {
            alert(errorThrown);
        }
    });
}

这里的/CaptchaWebService.asmx/GetCaptcha是指向Web服务的URL,后面会在WebService中实现该方法。

4. Web服务实现获取验证码

在Web服务中,需要实现获取验证码的方法,该方法返回一个JSON对象,包括验证码图片的URL和验证码字符串:

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public void GetCaptcha()
{
    string captchaCode = GenerateCaptchaCode();
    GenerateCaptchaImage(captchaCode);
    string imageUrl = string.Format("/CaptchaImageHandler.ashx?c={0}", captchaCode);
    var result = new { ImageUrl = imageUrl, CaptchaCode = captchaCode };
    JavaScriptSerializer js = new JavaScriptSerializer();
    Context.Response.Write(js.Serialize(result));
}

5. 验证用户输入

最后,验证用户输入的验证码是否正确。前端页面可以通过以下方式获取用户输入的验证码:

var captchaCode = $("#inputCaptcha").val();

然后将该验证码字符串和Web服务返回的验证码字符串进行比较,判断用户输入的验证码是否正确。

完整代码

下面是完整的代码。其中,CaptchaImageHandler.ashx用于从URL中获取验证码字符串,并调用GenerateCaptchaImage方法生成验证码图片。CaptchaWebService.asmx用于提供获取验证码的Web服务。

// CaptchaImageHandler.ashx.cs
public class CaptchaImageHandler : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "image/png";
        string captchaCode = context.Request.QueryString["c"];
        GenerateCaptchaImage(captchaCode);
    }
    public bool IsReusable => false;
    private void GenerateCaptchaImage(string captchaCode)
    {
        Bitmap image = new Bitmap(80, 30);
        Graphics graphics = Graphics.FromImage(image);
        graphics.Clear(Color.White);

        // 绘制验证码
        graphics.DrawString(captchaCode, new Font("Arial", 16), Brushes.Black, new PointF(5, 5));

        // 绘制噪点
        Random random = new Random();
        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()));
        }

        // 绘制边框
        graphics.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);

        // 输出图片
        MemoryStream memoryStream = new MemoryStream();
        image.Save(memoryStream, ImageFormat.Png);
        HttpContext.Current.Response.BinaryWrite(memoryStream.ToArray());
    }
}

// CaptchaWebService.asmx.cs
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
public class CaptchaWebService : System.Web.Services.WebService
{
    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public void GetCaptcha()
    {
        string captchaCode = GenerateCaptchaCode();
        GenerateCaptchaImage(captchaCode);
        string imageUrl = string.Format("/CaptchaImageHandler.ashx?c={0}", captchaCode);
        var result = new { ImageUrl = imageUrl, CaptchaCode = captchaCode };
        JavaScriptSerializer js = new JavaScriptSerializer();
        Context.Response.Write(js.Serialize(result));
    }

    private void GenerateCaptchaImage(string captchaCode)
    {
        Bitmap image = new Bitmap(80, 30);
        Graphics graphics = Graphics.FromImage(image);
        graphics.Clear(Color.White);

        // 绘制验证码
        graphics.DrawString(captchaCode, new Font("Arial", 16), Brushes.Black, new PointF(5, 5));

        // 绘制噪点
        Random random = new Random();
        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()));
        }

        // 绘制边框
        graphics.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);

        // 输出图片
        MemoryStream memoryStream = new MemoryStream();
        image.Save(memoryStream, ImageFormat.Png);
        HttpContext.Current.Response.BinaryWrite(memoryStream.ToArray());
    }

    private string GenerateCaptchaCode()
    {
        string captchaCode = "";
        var random = new Random();
        for (int i = 0; i < 5; i++)
        {
            captchaCode += (char)('a' + random.Next(0, 26));
        }
        return captchaCode;
    }
}

示例说明

假设我们需要在一个ASP.NET网页中实现无刷新验证码验证,可以按照以下步骤进行:

示例1:生成验证码图片

在我们的ASP.NET页面中,添加一个按钮,点击该按钮可以生成一个新的验证码图片和验证码字符串:

<button id="btnRefreshCaptcha" type="button" onclick="getCaptcha()">刷新</button>
<img id="captchaImg" src="#" alt="验证码" /><br/><br/>
<input id="captchaCode" type="hidden" />

在Javascript中,使用getCaptcha()方法来调用Web服务,获取验证码图片和验证码字符串:

function getCaptcha() {
    $.ajax({
        url: '/CaptchaWebService.asmx/GetCaptcha',
        type: 'POST',
        dataType: 'json',
        success: function (data) {
            $("#captchaImg").attr("src", data.ImageUrl);
            $("#captchaCode").val(data.CaptchaCode);
        },
        error: function (xhr, statusText, errorThrown) {
            alert(errorThrown);
        }
    });
}

示例2:验证用户输入

在表单中,添加一个验证码输入框和一个提交按钮。在提交时,验证用户输入的验证码是否正确:

<form method="post" action="form-submit-action">
    <!-- 省略其他表单元素 -->
    <label>验证码:</label>
    <input id="inputCaptcha" type="text" name="captcha" />
    <button type="submit" onclick="return validateCaptcha()">提交</button>
</form>

在Javascript中,使用validateCaptcha()方法来验证用户输入的验证码是否正确:

function validateCaptcha() {
    var captchaCode = $("#inputCaptcha").val();
    var expectedCaptchaCode = $("#captchaCode").val();
    if (captchaCode === expectedCaptchaCode) {
        return true; // 验证通过,提交表单
    } else {
        alert("验证码输入错误!");
        return false; // 验证失败,不提交表单
    }
}

使用以上的示例代码,我们就可以在ASP.NET中实现无刷新验证码验证了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:ASP.NET中的无刷新验证码的开发(完整代码) - Python技术站

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

相关文章

  • C#强制转换和尝试转换的方法

    C#中的类型转换分为强制转换和尝试转换两种方法。 强制转换 强制转换是将一种数据类型转换为另一种数据类型,如果无法转换则会在运行时产生异常。在C#中,强制转换使用一对小括号来实现,括号中放置需要被转换的数据类型。例如: int i = 10; double d = (double)i; 在这个例子中,将一个整型变量i强制转换为double类型,结果存储在另一…

    C# 2023年5月15日
    00
  • Xamarin.Forms在安卓机上进行本机调试

    下面是“Xamarin.Forms在安卓机上进行本机调试”的完整攻略: 步骤一:启用安卓机的开发者模式 在安卓机上启用开发者模式的具体步骤会因不同的 Android 版本而略有不同,一般这个选项位于“设置”应用的“关于手机”或“系统”菜单中。具体可以下载一些 Android 开发相关的文档查阅,这里不再赘述。 步骤二:使用电脑连接安卓机 将安卓机通过 USB…

    C# 2023年6月3日
    00
  • C# 调用命令行执行Cmd命令的操作

    C# 调用命令行执行 Cmd 命令可以通过使用 Process 类实现。下面是具体步骤: 1. 引用命名空间 在 C# 中使用 Process 类需要引用 System.Diagnostics 命名空间,因此需要在文件头部添加以下代码: using System.Diagnostics; 2. 创建 Process 对象 创建一个 Process 对象,可以…

    C# 2023年6月7日
    00
  • C#/VB.NET 在Word中添加条码、二维码的示例代码

    请注意以下的详细攻略: 准备工作 在使用C#/VB.NET代码添加条码或者二维码前,我们需要先安装对应的NuGet包。在Visual Studio中,可以通过NuGet Package Manager来安装。 对于添加条码,我们可以使用一个叫做ZXing.Net的Nuget包。ZXing.Net是一个用C#编写的开源程序库,用于读写二维码和条形码。它支持多种…

    C# 2023年5月31日
    00
  • c#使用热键实现程序窗口隐藏示例

    让我来详细讲解一下C#使用热键实现程序窗口隐藏的攻略。 步骤一:注册系统热键 在C#中使用热键需要注册全局热键,这可以通过调用Windows API函数实现。以下是一些示例代码,用于注册和注销全局热键: using System.Runtime.InteropServices; public class GlobalHotkey { [DllImport(&…

    C# 2023年6月7日
    00
  • Unity3D如何获取时间戳或北京时间

    获取时间戳或北京时间可以使用Unity3D内置的API来实现。下文将对获取时间戳和北京时间的方法进行详细讲解,并提供两个示例说明。 获取时间戳 方法一:使用System.DateTime.Now.Ticks属性 System.DateTime.Now.Ticks 返回自 0001 年 1 月 1 日午夜以来的 100 毫微秒间隔数,可以作为时间戳。要获取当前…

    C# 2023年6月1日
    00
  • C#实现单例模式的几种方法总结

    C#实现单例模式的几种方法总结 单例模式是一种常用的设计模式,它确保一个类只有一个实例,而且提供一个访问该实例的全局访问点。在C#中,实现单例模式有多种方法,下面将详细讲解。 1. 懒汉式单例模式 在懒汉式单例模式中,实例对象在第一次被访问时才会被创建。它的实现方式比较简单,如下所示: public class Singleton { private sta…

    C# 2023年5月15日
    00
  • C#实现简单成绩管理系统的完整步骤

    为了让大家更容易理解,我将这个攻略分为以下几个步骤: 步骤一:搭建环境 我们的第一步是搭建C#开发环境。首先需要安装Visual Studio或者其他的C#IDE,比如Rider等。安装完成后,在IDE中创建一个新的控制台应用程序项目。 步骤二:创建数据结构 我们需要为成绩管理系统创建一个数据结构,用于存储学生姓名和成绩。我们可以使用C#中的类来实现这个数据…

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