<%@ WebHandler Language="C#" Class="chksum" %> using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Diagnostics; using System.Web; using System.IO; using System.Drawing; using System.Drawing.Imaging; using System.Web.SessionState; public class chksum : IHttpHandler, IRequiresSessionState { public void ProcessRequest(HttpContext context) { string sCode = string.Empty; //清除該頁輸出緩存,設置該頁無緩存 context.Response.Buffer = true; context.Response.ExpiresAbsolute = System.DateTime.Now.AddMilliseconds(0); context.Response.Expires = 0; context.Response.CacheControl = "no-cache"; context.Response.AppendHeader("Pragma", "No-Cache"); //將驗證碼圖片寫入記憶體流,並將其以 "image/Png" 格式輸出 MemoryStream oStream = new MemoryStream(); try { //Randomize() //Dim clen As New Random CreateValidateCodeImage(ref oStream, ref sCode, 4, 120, 36, 20); //Response.Cookies("chknum").Value = sCode //Response.Cookies("chknum").Expires = DateAdd("D", 1, Today) context.Session["chknum"] = sCode; context.Response.ClearContent(); context.Response.ContentType = "image/Png"; context.Response.BinaryWrite(oStream.ToArray()); } finally { //釋放資源 oStream.Dispose(); } } /// /// 產生圖形驗證碼。 /// public Bitmap CreateValidateCodeImage(ref string Code, int CodeLength, int Width, int Height, int FontSize) { string sCode = string.Empty; //顏色列表,用於驗證碼、噪線、噪點 Color[] oColors = { System.Drawing.Color.Black, System.Drawing.Color.DimGray, System.Drawing.Color.Red, System.Drawing.Color.IndianRed, System.Drawing.Color.OliveDrab, System.Drawing.Color.OrangeRed, System.Drawing.Color.DarkOrange, System.Drawing.Color.DarkOliveGreen, System.Drawing.Color.Brown, System.Drawing.Color.BlueViolet, System.Drawing.Color.DarkBlue }; //字體列表,用於驗證碼 string[] oFontNames = { "Times New Roman", "MS Mincho", "Book Antiqua", "Gungsuh", "PMingLiU", "Impact" }; //驗證碼的字元集,去掉了一些容易混淆的字元 char[] oCharacter = { '2', '3', '4', '5', '6', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'R', 'S', 'T', 'W', 'X', 'Y' }; Random oRnd = new Random(Guid.NewGuid().GetHashCode()); Bitmap oBmp = null; Graphics oGraphics = null; int N1 = 0; System.Drawing.Point oPoint1 = default(System.Drawing.Point); System.Drawing.Point oPoint2 = default(System.Drawing.Point); string sFontName = null; Font oFont = null; Color oColor = default(Color); //生成驗證碼字串 for (N1 = 0; N1 < CodeLength ; N1++) { sCode += oCharacter[oRnd.Next(oCharacter.Length)]; } double scale = 1.5; oBmp = new Bitmap((int)(Width*scale), (int)(Height*scale)); oGraphics = Graphics.FromImage(oBmp); oGraphics.Clear(System.Drawing.Color.White); try { FontStyle[] fs = { FontStyle.Italic , FontStyle.Bold, FontStyle.Regular}; for (N1 = 0; N1 <= sCode.Length - 1; N1++) { //畫驗證碼字串 sFontName = oFontNames[oRnd.Next(oFontNames.Length)]; oFont = new Font(sFontName, FontSize, fs[oRnd.Next(fs.Length)]); oColor = oColors[oRnd.Next(oColors.Length)]; oGraphics.DrawString(sCode[N1].ToString(), oFont, new SolidBrush(oColor), Convert.ToSingle(N1) * FontSize + 16, Convert.ToSingle(4)); } for (N1 = 0; N1 <= 5; N1++) { //畫噪線 oPoint1.X = oRnd.Next(Width); oPoint1.Y = oRnd.Next(Height); oPoint2.X = oRnd.Next(Width); oPoint2.Y = oRnd.Next(Height); oColor = oColors[oRnd.Next(oColors.Length)]; oGraphics.DrawLine(new Pen(oColor), oPoint1, oPoint2); } for (int i = 0; i <= 600; i++) { //畫噪點 int x = oRnd.Next(oBmp.Width); int y = oRnd.Next(oBmp.Height); Color clr = oColors[oRnd.Next(oColors.Length)]; oBmp.SetPixel(x, y, clr); } Code = sCode; return oBmp; } finally { oGraphics.Dispose(); } } /// /// 產生圖形驗證碼。 /// public void CreateValidateCodeImage(ref MemoryStream MemoryStream, ref string Code, int CodeLength, int Width, int Height, int FontSize) { Bitmap oBmp = null; oBmp = CreateValidateCodeImage(ref Code, CodeLength, Width, Height, FontSize); try { oBmp.Save(MemoryStream, ImageFormat.Png); } finally { oBmp.Dispose(); } } public bool IsReusable { get { return false; } } }