ASP.NET3种验证码[转]
生活随笔
收集整理的這篇文章主要介紹了
ASP.NET3种验证码[转]
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.GSC_WebControlLibrary 這是在網上找到的一個控件,非常好用。但是效果不是特別好(見下圖。
)雖然容易使用,所有的屬性都可以像控件一樣設置,但是可用性不太高。用戶不能自定義,而且看起來這個驗證碼效果不太好。
效果:
2.用一個頁面生成圖片,另一個頁面調用,驗證碼存入cookie,調用時取cookie對比驗證.這個用戶就可以按自己的喜好更改效果和驗證碼的長度了 (:
效果如圖:
代碼如下:
CheckCode.aspx 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;
public?partial?class?Tools_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
<img?src="Tools/CheckCode.aspx"?alt="驗證碼"?style="width:?60px;?height:?24px"?/>
3.用web handler生成圖片。這個其實和前面的意思大致差不多,調用方法也基本和2一樣,不同的是,他的驗證碼是存入Session的。供學習參考。
效果圖如下:
ValidateImageHandler.ashx
%@?WebHandler?Language="C#"?Class="ValidateImageHandler"?%>
using?System;
using?System.Web;
using?System.Web.SessionState;
using?System.Drawing;
using?System.Drawing.Imaging;
using?System.Text;
/**////?<summary>
///?ValidateImageHandler?生成網站驗證碼功能
///?</summary>
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;
????????}
????}
}
)雖然容易使用,所有的屬性都可以像控件一樣設置,但是可用性不太高。用戶不能自定義,而且看起來這個驗證碼效果不太好。
效果:
2.用一個頁面生成圖片,另一個頁面調用,驗證碼存入cookie,調用時取cookie對比驗證.這個用戶就可以按自己的喜好更改效果和驗證碼的長度了 (:
效果如圖:
代碼如下:
CheckCode.aspx 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;
public?partial?class?Tools_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
<img?src="Tools/CheckCode.aspx"?alt="驗證碼"?style="width:?60px;?height:?24px"?/>
3.用web handler生成圖片。這個其實和前面的意思大致差不多,調用方法也基本和2一樣,不同的是,他的驗證碼是存入Session的。供學習參考。
效果圖如下:
ValidateImageHandler.ashx
%@?WebHandler?Language="C#"?Class="ValidateImageHandler"?%>
using?System;
using?System.Web;
using?System.Web.SessionState;
using?System.Drawing;
using?System.Drawing.Imaging;
using?System.Text;
/**////?<summary>
///?ValidateImageHandler?生成網站驗證碼功能
///?</summary>
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;
????????}
????}
}
總結
以上是生活随笔為你收集整理的ASP.NET3种验证码[转]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浮出水面
- 下一篇: 对 Jquery 表单插件 Form.j