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#导入导出EXCEL文件的代码实例

    对于C#导入导出EXCEL文件的代码实例,以下是详细的攻略及示例说明: 1. 导出Excel文件 1.1 引用必要的命名空间 using System.IO; using System.Data; using System.Reflection; using System.Runtime.InteropServices; using Microsoft.Of…

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

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

    C# 2023年6月3日
    00
  • Unity 从Resources中动态加载Sprite图片的操作

    下面是详细讲解“Unity 从Resources中动态加载Sprite图片的操作”的完整攻略。 一、前言 在Unity中,我们可以将一些资源文件放在一个名为“Resources”的文件夹中。这些资源文件可以通过Resources.Load方法进行动态加载,其中包括图片、音频、视频等资源。在本文中,我们将详细讲解如何在Unity中动态加载Sprite图片。 二…

    C# 2023年6月3日
    00
  • Unity 如何设定 Animator分割播放

    接下来我将为你详细讲解如何设定Animator分割播放。 什么是Animator分割播放 Animator分割播放是指将动画Clip分割成若干段进行播放,根据具体的游戏需求控制各段的播放顺序、单次播放次数、循环播放次数等。 设定Animator分割播放的步骤 步骤一:打开Animator窗口 在Unity编辑器中,双击要添加分割播放的动画角色的Animato…

    C# 2023年6月3日
    00
  • C#实现推送钉钉消息的方法示例

    C#实现推送钉钉消息的方法示例 简介 钉钉作为一款企业通讯解决方案,提供了多种钉钉开放能力,开发者可以通过API对接钉钉实现企业级应用。其中消息推送是企业使用频率较高的功能之一,本文将介绍如何使用C#实现消息推送功能。 步骤 1.注册开放平台 在使用钉钉API前,需要先在钉钉开放平台注册账号并创建应用。如未注册需先进行注册,注册完成后创建应用,获取AppKe…

    C# 2023年5月31日
    00
  • C#中把字符串String转换为整型Int的小例子

    下面是详细讲解“C#中把字符串String转换为整型Int的小例子”的攻略: 准备工作 首先,我们需要确保我们已经安装并配置好了C#开发环境。如果还没有的话可以前往官网下载安装。 字符串与整型类型间的转换 在C#中,将字符串转换为整型类型可以使用Convert.ToInt32()方法,也可以使用int.Parse()方法。这两个方法都可以将字符串转换为整型类…

    C# 2023年6月1日
    00
  • 深入讲解C#编程中嵌套类型和匿名类型的定义与使用

    深入讲解C#编程中嵌套类型与匿名类型 嵌套类型定义与使用 嵌套类型是在一个类或结构中定义其他类或结构。嵌套类可以有任何访问修饰符:public、protected、internal、和private。下面我们来看一个示例: public class OuterClass { private int outerField; public OuterClass(…

    C# 2023年5月31日
    00
  • C#执行DOS命令的方法

    C#可以通过 System.Diagnostics.Process 类来实现执行DOS命令的功能。 具体步骤如下: 1. 引入命名空间 using System.Diagnostics; 2. 实例化Process对象 Process process = new Process(); 3. 配置Process对象属性 我们需要设置 ProcessStartI…

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