驗證碼在很多需要用戶登陸或發表言論的網頁上都可以見到。傳統的一般是用代表各種不同數字或字 符的圖片來進行組合,從而實現效果。但是,很明顯這種方式的靈活性不高,而且需要准備大量的圖片作 素材。
目前,一般就是采用全自動生成,整個驗證碼為一張圖片,而不是多張圖片的組合。在.Net中,可以 通過GDI+來實現,可能你會覺得很麻煩,但只要跟著我操作一遍,你就會發現其實很簡單。
現在,就開始制作一個最簡單的驗證碼。 (這裡並不介紹如何使用GDI+技術,相關內容請大家查看 這裡)
1.既然要產生驗證碼,那是關鍵的莫過於生成隨機數(這裡的隨機數,指的是數字與字母的組合)。
大家想一下數字和字符是不是都有是用ASCII碼進行編碼進行表示?因此,想要生成含字母和數字的隨 機數,不僅僅只有通過事先提供所有數字和字母這種方法,還可以有很多種辦法。大家如果什麼好的辦法 ,希望不吝賜教。我今天要介紹的是一種很簡單的辦法。直接來看代碼吧:
生成隨機數
public static string Generate(RandomGeneratorStyle style, int length)
{
string strValidateString="";
Random rnd = new Random();
string strValidateStringSource;
switch (style)
{
case RandomGeneratorStyle.Number:
strValidateStringSource = "0123456789";
break;
case RandomGeneratorStyle.NumberAndChar:
strValidateStringSource = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
break;
case RandomGeneratorStyle.NumberAndCharIgnoreCase:
strValidateStringSource = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
break;
default:
strValidateStringSource = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
break;
}
for (int i = 0; i < length; i++)
{
strValidateString += strValidateStringSource[rnd.Next (strValidateStringSource.Length - 1)];
}
return strValidateString;
}
上面有一個RandomGeneratorStyle,這個是我自己寫的一個枚舉,用於表示需要生成哪種驗證碼。
RandomGeneratorStyle
public enum RandomGeneratorStyle
{
/// <summary>
/// 只有數字
/// </summary>
Number,
/// <summary>
/// 包含數字和大小寫字符
/// </summary>
NumberAndChar,
/// <summary>
/// 包含數字和大寫字符
/// </summary>
NumberAndCharIgnoreCase
}
2.有了這些數,那下面就基本上考你是畫畫的功夫了。當然這裡用到的不是顏料、水彩筆等,而是要 用GDI+。
平時,我們看見的驗證碼是什麼樣式子的?是不是一個矩形?矩形裡面有一些隨機數?那接下去要做 的就是用GDI+技術把生成的隨機數畫到一個矩形中。
這個要用到的主要的就只有一個方法:Graphics.DrawString();不了解的朋友可以先去網上查查關於 這個方法的介紹。下面直接來看代碼:
繪制驗證碼
public static void Generate(RandomGeneratorStyle style, int length,Page curPage)
{
Bitmap bmp = new Bitmap((int)Math.Ceiling(length * 12.5), 20);//新建一個圖 片對象
Graphics g = Graphics.FromImage(bmp);//利用該圖片對象生成“畫板”
string strCode = RandomGenerator.Generate(style, length);//生成隨機數
curPage.Session["yzmCode"] = strCode;//保存到Session中,為驗證服務.你也可以存放 在其它地方,只要在需要驗證的時候你能取到
Font font = new Font("Arial", 12, FontStyle.Bold | FontStyle.Italic);//設 置字體顏色
SolidBrush brush = new SolidBrush(Color.White);//新建一個畫刷,到這裡為止,我們 已經准備好了畫板、畫刷、和數據
g.DrawString(strCode, font, brush, 0, 0);//關鍵的一步,進行繪制。
bmp.Save(curPage.Response.OutputStream, ImageFormat.Jpeg);//保存為輸出流,否則頁 面上顯示不出來
g.Dispose();//釋放掉該資源
}
現在,就可以來測試下它的效果了。想要調用上面的方法,我們必須要傳入一個當前的Page對象,為 此我們可以新建一個頁面命名為yzm.aspx。然後,在PageLoad中調用該方法。這樣,我們便可以看到它了 。如下圖1所示:
圖1 驗證碼
如果,你需要在img元素中顯示,那也很簡單,只需要把src設置為yzm.aspx就可以了。<img src="yzm.aspx" alt="" />
最後,再來介紹下如何進行驗證。(如果只顯示,不驗證,那就不能管它叫驗證碼了。)
細心的朋友應該已經發現,在繪制驗證碼的方法中,我設置了一個Session。那要進行驗證的話,自然 是通過與這個繪制時所設置的Session比較了。代碼如下:
驗證方法
public static bool Validate(string codeToBeValidate,Page curPage)
{
if (curPage.Session["yzmCode"] != null)
{
return curPage.Session["yzmCode"].ToString() == codeToBeValidate;
}
else
return false;
}
通過上面的這種方式,就可以生成驗證碼了。如果你想要生成漂亮些的驗證碼,那就需要你自己在繪 制過程中再動動腦筋了。
出處:http://stg609.cnblogs.com/