ASP.NET生成验证码的三种形式【附源码下载】

搜索下网上ASP.NET生成验证码,不知如何区分,从使用文件来看有以下3种形式,完整项目如下:

ASP.NET生成验证码的三种形式【附源码下载】

一、利用外来组件:利用网上的组件GSC_WebControlLibrary大家可以下载下,下载不了找我,这个组件也挺好用。添加引用就可以了,默认是用Cookie的,当然为了安全也可改下属性了,如下:
CodeCacheType="HttpSession"
用的时候,其Session键为CODE,如下代码,完整代码及效果看最后

if (Session["CODE"] != null) { Label1.Text = (Session["CODE"].ToString() == TextBox1.Text).ToString(); }


二、书写一个aspx页面:用一个页面生成图片,另一个页面调用,验证码存入cookie,调用时取cookie对比验证.当然最好还是用session,按自己的喜好更改效果和验证码的长度了。

建立一个CheckCode.aspx页面,其CheckCode.aspx.cs代码为:

using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; namespace WebAppValidateCode { public partial class CheckCode : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { this.CreateCheckCodeImage(GenerateCheckCode()); } private string GenerateCheckCode() { int number; char code; string checkCode = String.Empty; System.Random random = new Random(); for (int i = 0; i < 5; i++) { number = random.Next(); if (number % 2 == 0) code = (char)('0' + (char)(number % 10)); else code = (char)('A' + (char)(number % 26)); checkCode += code.ToString(); } Response.Cookies.Add(new HttpCookie("CheckCode", checkCode)); return checkCode; } private void CreateCheckCodeImage(string checkCode) { if (checkCode == null || checkCode.Trim() == String.Empty) return; System.Drawing.Bitmap image = new System.Drawing.Bitmap((int)Math.Ceiling((checkCode.Length * 12.5)), 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.GreenYellow), x1, y1, x2, y2); } Font font = new System.Drawing.Font("Verdana", 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(checkCode, font, brush, 2, 2); //画图片的前景噪音点 for (int i = 0; i < 80; 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.Red), 0, 0, image.Width - 1, image.Height - 1); System.IO.MemoryStream ms = new System.IO.MemoryStream(); image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif); Response.ClearContent(); Response.ContentType = "image/Gif"; Response.BinaryWrite(ms.ToArray()); } finally { g.Dispose(); image.Dispose(); } } } }

前台调用:然后在需要使用的页面引用UseCheckCode.aspx,HTML代码如下,完整代码及效果看最后

<img src="CheckCode.aspx" alt="验证码" style="width: 60px; height: 24px" />

后台调用:后台代码的调用形式如下,完整代码及效果看最后

HttpCookie cookie = Request.Cookies["CheckCode"]; if (cookie != null) { Label2.Text = (cookie.Value == TextBox2.Text).ToString(); }


3、建立一般处理程序:一般处理程序ValidateImageHandler.ashx的代码如下,,完整代码及效果看最后

using System; using System.Web; using System.Web.SessionState; using System.Drawing; using System.Drawing.Imaging; using System.Text; using System.Web.Services; namespace WebAppValidateCode { /// <summary> /// ValidateImageHandler 生成网站验证码功能 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class ValidateImageHandler : IHttpHandler, IRequiresSessionState { int intLength = 5; //长度 string strIdentify = "Identify"; //随机字串存储键值,以便存储到Session中 public ValidateImageHandler() { } /**/ /// <summary> /// 生成验证图片核心代码 /// </summary> /// <param name="hc"></param> public void ProcessRequest(HttpContext hc) { //设置输出流图片格式 hc.Response.ContentType = "image/gif"; Bitmap b = new Bitmap(200, 60); Graphics g = Graphics.FromImage(b); g.FillRectangle(new SolidBrush(Color.YellowGreen), 0, 0, 200, 60); Font font = new Font(FontFamily.GenericSerif, 48, FontStyle.Bold, GraphicsUnit.Pixel); Random r = new Random(); //合法随机显示字符列表 string strLetters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; StringBuilder s = new StringBuilder(); //将随机生成的字符串绘制到图片上 for (int i = 0; i < intLength; i++) { s.Append(strLetters.Substring(r.Next(0, strLetters.Length - 1), 1)); g.DrawString(s[s.Length - 1].ToString(), font, new SolidBrush(Color.Blue), i * 38, r.Next(0, 15)); } //生成干扰线条 Pen pen = new Pen(new SolidBrush(Color.Blue), 2); for (int i = 0; i < 10; i++) { g.DrawLine(pen, new Point(r.Next(0, 199), r.Next(0, 59)), new Point(r.Next(0, 199), r.Next(0, 59))); } b.Save(hc.Response.OutputStream, ImageFormat.Gif); hc.Session[strIdentify] = s.ToString(); //先保存在Session中,验证与用户输入是否一致 hc.Response.End(); } /**/ /// <summary> /// 表示此类实例是否可以被多个请求共用(重用可以提高性能) /// </summary> public bool IsReusable { get { return true; } } } }

前台调用:然后在需要使用的页面引用ValidateImageHandler.ashx,HTML代码如下,完整代码及效果看最后

<img src="ValidateImageHandler.ashx" alt="验证码" style="width:200px; height: 60px" />

后台调用:后台代码的调用形式如下,完整代码及效果看最后

if (Session["Identify"] != null) { Label3.Text=(Session["Identify"].ToString() == TextBox3.Text).ToString(); }

调用的完整代码如下:

Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebAppValidateCode._Default" %>

<%@ Register assembly="GSC_WebControlLibrary" namespace="GSC_WebControlLibrary" tagprefix="cc1" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server">

<title></title>

</head>

<body>

<form id="form1" runat="server">

<div>

方法一:<br />

<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>

<cc1:VerifyCode ID="VerifyCode1" runat="server" CodeCacheType="HttpSession" />

<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />

<asp:Label ID="Label1" runat="server"></asp:Label>

<br />

方法二:<br />

<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>

<img src="CheckCode.aspx" alt="验证码" style="width: 60px; height: 24px" />

<asp:Button ID="Button2" runat="server" onclick="Button2_Click" Text="Button" />

<asp:Label ID="Label2" runat="server"></asp:Label>

<br />

方法三:<br />

<asp:TextBox ID="TextBox3" runat="server"></asp:TextBox>

<img src="ValidateImageHandler.ashx" alt="验证码" style="width:200px; height: 60px" />

<asp:Button ID="Button3" runat="server" onclick="Button3_Click" Text="Button" />

<asp:Label ID="Label3" runat="server"></asp:Label>

</div>

</form>

</body>

</html>

Default.aspx.cs代码如下:

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace WebAppValidateCode { public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } //方式一 protected void Button1_Click(object sender, EventArgs e) { if (Session["CODE"] != null) { Label1.Text = (Session["CODE"].ToString() == TextBox1.Text).ToString(); } } //方式二 protected void Button2_Click(object sender, EventArgs e) { HttpCookie cookie = Request.Cookies["CheckCode"]; if (cookie != null) { Label2.Text = (cookie.Value == TextBox2.Text).ToString(); } } //方式三 protected void Button3_Click(object sender, EventArgs e) { if (Session["Identify"] != null) { Label3.Text = (Session["Identify"].ToString() == TextBox3.Text).ToString(); } } } }

运行效果:

ASP.NET生成验证码的三种形式【附源码下载】


附源码【注:右键另存后把扩展名gif改为rar】:代码下载

参考:

http://hi.baidu.com/skyjoy2006/blog/item/ea39ca54ecb16b5bd009067a.html