Home  >  Article  >  Backend Development  >  Example code on how to use ASP.NET to implement the verification code generation function

Example code on how to use ASP.NET to implement the verification code generation function

黄舟
黄舟Original
2017-07-20 16:07:281425browse

This article mainly introduces the verification code generation function implemented by ASP.NET. It analyzes the principles, steps and related implementation techniques of asp.net to generate verification codes in detail in the form of examples. It also comes with demo source code for readers to download for reference. , Friends who need it can refer to

The example in this article describes the verification code generation function implemented by ASP.NET. Share it with everyone for your reference, the details are as follows:

Principle of generating verification code: generate random characters, generate the characters into pictures, and store them in the Session at the same time, and then verify whether the content entered by the user matches the content in the Session The verification code matches.

Rendering: Users can click to switch verification code information.

General handler: CheckCodeHandler.cs


##

<%@ WebHandler Language="C#" Class="CheckCodeHandler" %>
using System;
using System.Web;
using System.Text;
using System.Drawing;
using System.Web.SessionState;
public class CheckCodeHandler : IHttpHandler,IRequiresSessionState
{
  //产生验证码的字符集
  public string charcode = "2,3,4,5,6,8,9,A,B,C,D,E,F,G,H,J,K,M,N,P,R,S,U,W,X,Y,a,b,c,d,e,f,g,h,j,k,m,n,p,r,s,u,w,x,y";
  public void ProcessRequest (HttpContext context) {
    string validateCode = CreateRandomCode(4);
    context.Session["ValidateCode"] = validateCode;//将验证码保存到session中
    CreateCodeImage(validateCode, context);
  }
  public bool IsReusable {
    get {
      return false;
    }
  }
  /// <summary>
  /// 生成验证码
  /// </summary>
  /// <param name="n">验证码个数</param>
  /// <returns>验证码字符串</returns>
  public string CreateRandomCode(int n)
  {
    string[] CharArray = charcode.Split(&#39;,&#39;);//将字符串转换为字符数组
    string randomCode = "";
    int temp = -1;
    Random rand = new Random();
    for (int i = 0; i < n; i++)
    {
      if (temp != -1)
      {
        rand = new Random(i * temp * ((int)DateTime.Now.Ticks));
      }
      int t = rand.Next(CharArray.Length - 1);
      if (temp != -1 && temp == t)
      {
        return CreateRandomCode(n);
      }
      temp = t;
      randomCode += CharArray[t];
    }
    return randomCode;
  }
  public void CreateCodeImage(string checkCode, HttpContext context)
  {
    int iwidth = (int)(checkCode.Length * 13);
    System.Drawing.Bitmap image = new System.Drawing.Bitmap(iwidth, 20);
    Graphics g = Graphics.FromImage(image);
    Font f = new System.Drawing.Font("Arial", 12, (System.Drawing.FontStyle.Italic | System.Drawing.FontStyle.Bold));
    // 前景色
    Brush b = new System.Drawing.SolidBrush(Color.Black);
    // 背景色
    g.Clear(Color.White);
    // 填充文字
    g.DrawString(checkCode, f, b, 0, 1);
    // 随机线条
    Pen linePen = new Pen(Color.Gray, 0);
    Random rand = new Random();
    for (int i = 0; i < 5; i++)
    {
      int x1 = rand.Next(image.Width);
      int y1 = rand.Next(image.Height);
      int x2 = rand.Next(image.Width);
      int y2 = rand.Next(image.Height);
      g.DrawLine(linePen, x1, y1, x2, y2);
    }
    // 随机点
    for (int i = 0; i < 30; i++)
    {
      int x = rand.Next(image.Width);
      int y = rand.Next(image.Height);
      image.SetPixel(x, y, Color.Gray);
    }
    // 边框
    g.DrawRectangle(new Pen(Color.Gray), 0, 0, image.Width - 1, image.Height - 1);
    // 输出图片
    System.IO.MemoryStream ms = new System.IO.MemoryStream();
    image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
    context.Response.ClearContent();
    context.Response.ContentType = "image/jpeg";
    context.Response.BinaryWrite(ms.ToArray());
    g.Dispose();
    image.Dispose();
  }
}

Encapsulated into a class library: ValidateNumber.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Drawing;
using System.Web.UI;
using System.Drawing.Drawing2D;
using System.IO;
using System.Drawing.Imaging;
/// <summary>
///ValidateNumber 生成验证码
/// </summary>
public class ValidateNumber
{
  //产生验证码的字符集 (易混淆的字符去掉)
  private string charcode = "2,3,4,5,6,8,9,A,B,C,D,E,F,G,H,J,K,M,N,P,R,S,U,W,X,Y,a,b,c,d,e,f,g,h,j,k,m,n,p,r,s,u,w,x,y";
  /// <summary>
  /// 验证码的最大长度
  /// </summary>
  public int MaxLength
  {
    get { return 10; }
  }
  /// <summary>
  /// 验证码的最小长度
  /// </summary>
  public int MinLength
  {
    get { return 1; }
  }
  /// <summary>
  /// 生成验证码
  /// </summary>
  /// <param name="length">指定验证码的长度</param>
  /// <returns></returns>
  public string CreateValidateNumber(int length)
  {
    string[] CharArray = charcode.Split(&#39;,&#39;);//将字符串转换为字符数组
    string randomCode = "";
    int temp = -1;
    Random rand = new Random();
    for (int i = 0; i < length; i++)
    {
      if (temp != -1)
      {
        rand = new Random(i * temp * ((int)DateTime.Now.Ticks));
      }
      int t = rand.Next(CharArray.Length - 1);
      if (temp != -1 && temp == t)
      {
        return CreateValidateNumber(length);
      }
      temp = t;
      randomCode += CharArray[t];
    }
    return randomCode;
  }
  /// <summary>
  /// 创建验证码的图片
  /// </summary>
  /// <param name="context">context对象</param>
  /// <param name="validateNum">验证码</param>
  public void CreateValidateGraphic(HttpContext context,string validateNum)
  {
    int iwidth = (int)(validateNum.Length * 14);
    Bitmap image = new Bitmap(iwidth, 22);
    Graphics g = 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, (FontStyle.Bold | FontStyle.Italic));
      LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height),
       Color.Blue, Color.DarkRed, 1.2f, true);
      g.DrawString(validateNum, font, brush, 3, 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 stream = new MemoryStream();
      image.Save(stream, ImageFormat.Jpeg);
      //输出图片
      context.Response.Clear();
      context.Response.ContentType = "image/jpeg";
      context.Response.BinaryWrite(stream.ToArray());
    }
    finally
    {
      g.Dispose();
      image.Dispose();
    }
  }
  /// <summary>
  /// 得到验证码图片的长度
  /// </summary>
  /// <param name="validateNumLength">验证码的长度</param>
  /// <returns></returns>
  public static int GetImageWidth(int validateNumLength)
  {
    return (int)(validateNumLength * 14);
  }
  /// <summary>
  /// 得到验证码图片的高度
  /// </summary>
  /// <returns></returns>
  public static double GetImageHeight()
  {
    return 22;
  }
}

The above is the detailed content of Example code on how to use ASP.NET to implement the verification code generation function. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn