詳解ASP.NET驗(yàn)證碼的生成方法
一般驗(yàn)證碼的生成方法都是相同的,主要的步驟都有兩步
第一步:隨機(jī)出一系統(tǒng)驗(yàn)證碼的數(shù)字或字母,順便把隨機(jī)生成的數(shù)字或字母寫入Cookies 或者 Session。
第二步:用第一步隨機(jī)出來的數(shù)字或字母來合成圖片。
可以看出來驗(yàn)證碼的復(fù)雜度主要是第二步來完成,你可以根據(jù)自己所要的復(fù)雜度來設(shè)定。
我們一起來看看:
第一步:隨機(jī)生成數(shù)字或字母的方法
/// <summary> /// 生成驗(yàn)證碼的隨機(jī)數(shù) /// </summary> /// <returns>返回五位隨機(jī)數(shù)</returns> private string GenerateCheckCode() { int number; char code; string checkCode = String.Empty; Random random = new Random(); for (int i = 0; i < 5; i++)//可以任意設(shè)定生成驗(yàn)證碼的位數(shù) { 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));//寫入COOKIS Session["CheckCode"] = checkCode; //寫入Session,可以任意選一下 return checkCode; }
第二步:生成圖片
/// <summary> /// 生成驗(yàn)證碼圖片 /// </summary> /// <param name="checkCode"></param> private void CreateCheckCodeImage(string checkCode) { if (checkCode == null || checkCode.Trim() == String.Empty) return; Bitmap image = new Bitmap((int)Math.Ceiling((checkCode.Length * 12.5)), 22); Graphics g = Graphics.FromImage(image); try { //生成隨機(jī)生成器 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 System.Drawing.Font("Arial", 12, (System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic)); LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, true); g.DrawString(checkCode, font, brush, 2, 2); //畫圖片的前景噪音點(diǎn) 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 ms = new MemoryStream(); image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif); Response.ClearContent(); Response.ContentType = "image/Gif"; Response.BinaryWrite(ms.ToArray()); } finally {//釋放對象資源 g.Dispose(); image.Dispose(); }
*完整程序
先在VS2005里面的項(xiàng)目里面添加一個(gè) 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.IO; using System.Drawing.Drawing2D; public partial class checkCode : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { CreateCheckCodeImage(GenerateCheckCode());//調(diào)用下面兩個(gè)方法; } /// <summary> /// 生成驗(yàn)證碼的隨機(jī)數(shù) /// </summary> /// <returns>返回五位隨機(jī)數(shù)</returns> private string GenerateCheckCode() { int number; char code; string checkCode = String.Empty; Random random = new Random(); for (int i = 0; i < 5; i++)//可以任意設(shè)定生成驗(yàn)證碼的位數(shù) { 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));//寫入COOKIS Session["CheckCode"] = checkCode; //寫入Session,可以任意選一下 return checkCode; } /// <summary> /// 生成驗(yàn)證碼圖片 /// </summary> /// <param name="checkCode"></param> private void CreateCheckCodeImage(string checkCode) { if (checkCode == null || checkCode.Trim() == String.Empty) return; Bitmap image = new Bitmap((int)Math.Ceiling((checkCode.Length * 12.5)), 22); Graphics g = Graphics.FromImage(image); try { //生成隨機(jī)生成器 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 System.Drawing.Font("Arial", 12, (System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic)); LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, true); g.DrawString(checkCode, font, brush, 2, 2); //畫圖片的前景噪音點(diǎn) 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 ms = new MemoryStream(); image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif); Response.ClearContent(); Response.ContentType = "image/Gif"; Response.BinaryWrite(ms.ToArray()); } finally {//釋放對象資源 g.Dispose(); image.Dispose(); } } }
上面生成驗(yàn)證碼的頁面都做好了,我們來調(diào)用看看:
在你需要用到驗(yàn)證碼的地方加了Image控件
<asp:Image ID="Image1" runat="server" ImageUrl="~/checkCode.aspx" />
這樣驗(yàn)證碼就會顯示到Image控件上面了!
顯示弄好了,當(dāng)然我們要判斷一下用戶的輸入是否正確!
只要我們?nèi)〉糜脩糨斎氲闹蹈鶦ookis或者Session對比就OK了
取Cookies的值 Request.Cookies["CheckCode"].Value
取Session的值 Session["CheckCode"].ToString() ?。ㄗ詈孟扰袛郤ession是否空)
如果不要區(qū)分大小寫的話,就把用戶輸入的值和Cookies或Session的值都轉(zhuǎn)成大寫或都小寫
附用法
protected void Button1_Click(object sender, EventArgs e) { if (Request.Cookies["CheckCode"].Value == TextBox1.Text.Trim().ToString()) { Response.Write("Cookies is right"); } else { Response.Write("Cookies is wrong"); } if (Session["CheckCode"] != null) { if (Session["CheckCode"].ToString().ToUpper() == TextBox1.Text.Trim().ToString().ToUpper()) //這樣寫可以不能區(qū)分大小寫 { Response.Write("Session is right"); } else { Response.Write("Session is wrong"); } } }
以上就是本文的全部內(nèi)容,教大家如何制作ASP.NET驗(yàn)證碼,希望大家喜歡。
相關(guān)文章
ASP.NET開源導(dǎo)入導(dǎo)出庫Magicodes.IE完成Csv導(dǎo)入導(dǎo)出的方法
這篇文章主要介紹了ASP.NET開源導(dǎo)入導(dǎo)出庫Magicodes.IE完成Csv導(dǎo)入導(dǎo)出的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06ASP.NET抓取網(wǎng)頁內(nèi)容的實(shí)現(xiàn)方法
這篇文章主要介紹了ASP.NET抓取網(wǎng)頁內(nèi)容的實(shí)現(xiàn)方法,涉及使用HttpWebRequest及WebResponse抓取網(wǎng)頁內(nèi)容的技巧,需要的朋友可以參考下2015-02-02Entity Framework Core延遲加載(懶加載)用法
這篇文章介紹了Entity Framework Core延遲加載(懶加載)的使用方式,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02.NET 6開發(fā)TodoList應(yīng)用之實(shí)現(xiàn)接口請求驗(yàn)證
在響應(yīng)請求處理的過程中,我們經(jīng)常需要對請求參數(shù)的合法性進(jìn)行校驗(yàn),如果參數(shù)不合法,將不繼續(xù)進(jìn)行業(yè)務(wù)邏輯的處理。本文將介紹如何使用FluentValidation和MediatR實(shí)現(xiàn)接口請求驗(yàn)證,需要的可以參考一下2021-12-12.Net 文本框?qū)崿F(xiàn)內(nèi)容提示的實(shí)例代碼(仿Google、Baidu)
這篇文章主要介紹了.Net 文本框?qū)崿F(xiàn)內(nèi)容提示的實(shí)例代碼,需要的朋友可以參考下2014-02-02asp.net文件上傳帶進(jìn)度條實(shí)現(xiàn)案例(多種風(fēng)格)
這篇文章主要講解了asp.net文件上傳帶進(jìn)度條實(shí)現(xiàn)案例,有不同風(fēng)格的進(jìn)度條,一定有一款最適合你,感興趣的小伙伴們可以參考一下2015-09-09ASP.NET開發(fā)者使用jQuery應(yīng)該了解的幾件事情
如果你是有著APS.NET開發(fā)背景的人員,那么jQuery的幾個(gè)概念建議你應(yīng)該忘掉。像使用其它的framework一樣,你應(yīng)該學(xué)習(xí)一下jQuery的所有語法等約定來讓它更好的為你服務(wù)。2009-09-09