本文實例講述了asp.net使用ashx生成圖形驗證碼的方法。分享給大家供大家參考,具體如下:
驗證碼的好處不用我多說,你們都懂的。我在網上看到有人把驗證碼直接寫在aspx頁面里,也就是說這種方式請求驗證碼等于請求一個頁面,這樣做很不科學。如下所示
1
2
3
4
5
6
7
8
|
< form id = "form1" runat = "server" > < div > < asp:Image ID = "Image1" runat = "server" ImageUrl = "Default.aspx" /> < br /> < asp:TextBox ID = "TextBox1" runat = "server" ></ asp:TextBox > < asp:Button ID = "Button1" runat = "server" onclick = "Button1_Click" Text = "Button" /> </ div > </ form > |
這個代碼看著就覺得寫代碼的人比較欠揍,代碼寫成這樣子著實郁悶。驗證嗎也不寫點script做下切換。
下面我介紹一種方式來實現這樣的功能
1. 寫個ashx生成圖形驗證碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
using System; using System.Collections; using System.Data; using System.Linq; using System.Web; using System.Web.Services; using System.Web.Services.Protocols; using System.Xml.Linq; using System.Web.SessionState; using System.Drawing; namespace usechecknum.ashx { /// <summary> /// $codebehindclassname$ 的摘要說明 /// </summary> [WebService(Namespace = "http://tempuri.org/" )] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class doCreateNum : IHttpHandler,IRequiresSessionState { public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/html" ; string checkCode = GetValidation(5); // 產生5位隨機驗證碼字符 context.Session[ "Code" ] = checkCode; //將字符串保存到Session中,以便需要時進行驗證 System.Drawing.Bitmap image = new System.Drawing.Bitmap(70, 22); Graphics g = Graphics.FromImage(image); try { //生成隨機生成器 Random random = new Random(); //清空圖片背景色 g.Clear(Color.White); // 畫圖片的背景噪音線 int i; for (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.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); //畫圖片的前景噪音點 g.DrawRectangle( new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1); System.IO.MemoryStream ms = new System.IO.MemoryStream(); image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif); context.Response.ClearContent(); context.Response.ContentType = "image/Gif" ; context.Response.BinaryWrite(ms.ToArray()); } finally { g.Dispose(); image.Dispose(); } } public string GetValidation( int num) { string str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" ; //"或者寫漢字也行" string validatecode = "" ; Random rd = new Random(); for ( int i = 0; i < num; i++) { validatecode += str.Substring(rd.Next(0, str.Length), 1); } return validatecode; } public bool IsReusable { get { return false ; } } } } |
2. 在頁面上顯示驗證碼,因為我們生成的是圖形,所以可以直接寫在<img/>標簽里,我們只要寫段簡單的腳本就可以點擊鼠標切換驗證碼了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<%@ Page Language= "C#" AutoEventWireup= "true" CodeBehind= "index.aspx.cs" Inherits= "usechecknum._Default" %> <!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> <script language= "javascript" type= "text/javascript" > function changeCode() { var imgNode = document.getElementById( "vimg" ); imgNode.src = "ashx/doCreateNum.ashx?t=" + ( new Date()).valueOf(); // 這里加個時間的參數是為了防止瀏覽器緩存的問題 } </script> <body> <form id= "form1" runat= "server" > 請輸入驗證碼:<input type= "text" name= "checknum" /><img src= "ashx/doCreateNum.ashx" id= "vimg" onclick= "changeCode()" /> </form> </body> </html> |
說了半天,該是時候看看生成的驗證碼長什么樣了
希望本文所述對大家asp.net程序設計有所幫助。