CheckCode.cs
using System; using System.Data; using System.Configuration; 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; /// <summary> /// CheckCode 的摘要說明 /// </summary> public class CheckCode { public CheckCode() { // // TODO: 在此處添加建構函式邏輯 // } public static void DrawImage() { CheckCode img = new CheckCode(); HttpContext.Current.Session["CheckCode"] = img.RndNum(4); img.checkCodes(HttpContext.Current.Session["CheckCode"].ToString()); } /// <summary> /// 產生驗證圖片 /// </summary> /// <param name="checkCode">驗證字元</param> private void checkCodes(string checkCode) { int iwidth = (int)(checkCode.Length * 13); System.Drawing.Bitmap image = new System.Drawing.Bitmap(iwidth, 23); Graphics g = Graphics.FromImage(image); g.Clear(Color.White); //定義顏色 Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple }; //定義字型 string[] font = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋體" }; Random rand = new Random(); //隨機輸出噪點 for (int i = 0; i < 50; i++) { int x = rand.Next(image.Width); int y = rand.Next(image.Height); g.DrawRectangle(new Pen(Color.LightGray, 0), x, y, 1, 1); } //輸出不同字型和顏色的驗證碼字元 for (int i = 0; i < checkCode.Length; i++) { int cindex = rand.Next(7); int findex = rand.Next(5); Font f = new System.Drawing.Font(font[findex], 10, System.Drawing.FontStyle.Bold); Brush b = new System.Drawing.SolidBrush(c[cindex]); int ii = 4; if ((i + 1) % 2 == 0) { ii = 2; } g.DrawString(checkCode.Substring(i, 1), f, b, 3 + (i * 12), ii); } //畫一個邊框 g.DrawRectangle(new Pen(Color.Black, 0), 0, 0, image.Width - 1, image.Height - 1); //輸出到瀏覽器 System.IO.MemoryStream ms = new System.IO.MemoryStream(); image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); HttpContext.Current.Response.ClearContent(); //Response.ClearContent(); HttpContext.Current.Response.ContentType = "image/Jpeg"; HttpContext.Current.Response.BinaryWrite(ms.ToArray()); g.Dispose(); image.Dispose(); } /// <summary> /// 產生隨機的字母 /// </summary> /// <param name="VcodeNum">產生字母的個數</param> /// <returns>string</returns> private string RndNum(int VcodeNum) { string Vchar = "0,1,2,3,4,5,6,7,8,9"; string[] VcArray = Vchar.Split(','); string VNum = ""; //由於字串很短,就不用StringBuilder了 int temp = -1; //記錄上次隨機數值,盡量避免生產幾個一樣的隨機數 //採用一個簡單的演算法以保證產生隨機數的不同 Random rand = new Random(); for (int i = 1; i < VcodeNum + 1; i++) { if (temp != -1) { rand = new Random(i * temp * unchecked((int)DateTime.Now.Ticks)); } int t = rand.Next(VcArray.Length); if (temp != -1 && temp == t) { return RndNum(VcodeNum); } temp = t; VNum += VcArray[t]; } return VNum; } }
再建立一個引用類的頁面checkCode.aspx前台不用寫東西,後台引用我們建立的類的DrawImage()方法即可。
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; public partial class checkCode : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { CheckCode.DrawImage(); } }
下面我們在需要驗證碼的頁面引用checkCode.aspx頁面即可。
前台
<asp:TextBox ID="Validator" runat="server" Width="150px" ></asp:TextBox> <img id="Img1" alt="看不清,請點擊我!" onclick="this.src=this.src+'?'" src="checkCode.aspx" style="width: 73px; height: 22px" align="left" /> <asp:ImageButton ID="imgBtnLogin" runat="server" ImageUrl="~/Images/Login.GIF" OnClick="imgBtnLogin_Click" />
後台判斷
protected void imgBtnLogin_Click(object sender, ImageClickEventArgs e) { if(this.Validator.Text==Session["CheckCode"].ToString()) { //。。。。 } else { Response.Write("<script>alert('驗證碼輸入錯誤,請重新輸入!');Location='MumberValidate.aspx'</script>"); return; } }
以上代碼請根據實際情況作適當修改。