using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Drawing; using System.Web.UI.WebControls; using System.Drawing.Imaging; using System.Web.SessionState; namespace Bowin.Common { public class VerificationCodeModule : IHttpModule, IRequiresSessionState { public void Dispose() { } public void Init(HttpApplication context) { context.PreRequestHandlerExecute += new EventHandler(context_PreRequestHandlerExecute); } void context_PreRequestHandlerExecute(object sender, EventArgs e) { HttpApplication context = (HttpApplication)sender; string str = context.Request.Url.ToString(); if (str.Contains("verificationCode.png")) { //context.Response.Cache.SetNoStore(); this._random = new Random(); this._code = GetRandomCode(); context.Session["code"] = this._code; this.SetPageNoCache(context); this.OnPaint(context); context.Response.End(); } else { return; } } static string[] FontItems = new string[] { "Arial", "Helvetica", "Geneva", "sans-serif", "Verdana" }; static Brush[] BrushItems = new Brush[] { Brushes.OliveDrab, Brushes.ForestGreen, Brushes.DarkCyan, Brushes.LightSlateGray, Brushes.RoyalBlue, Brushes.SlateBlue, Brushes.DarkViolet, Brushes.MediumVioletRed, Brushes.IndianRed, Brushes.Firebrick, Brushes.Chocolate, Brushes.Peru, Brushes.Goldenrod }; static string[] BrushName = new string[] { "OliveDrab", "ForestGreen", "DarkCyan", "LightSlateGray", "RoyalBlue", "SlateBlue", "DarkViolet", "MediumVioletRed", "IndianRed", "Firebrick", "Chocolate", "Peru", "Goldenrod" }; private static Color BackColor = Color.White; private static Pen BorderColor = Pens.DarkGray; private static int Width = 52; private static int Height = 21; private Random _random; private string _code; private int _brushNameIndex; /**/ /**/ /**/ /// /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent() { //this.Load += new System.EventHandler(this.Page_Load); } /**/ /**/ /**/ /// /// 设置页面不被缓存 /// private void SetPageNoCache(HttpApplication context) { context.Response.Buffer = true; context.Response.ExpiresAbsolute = System.DateTime.Now.AddSeconds(-1); context.Response.Expires = 0; context.Response.CacheControl = "no-cache"; context.Response.AppendHeader("Pragma", "No-Cache"); } /**/ /**/ /**/ /// /// 取得一个 4 位的随机码 /// /// private string GetRandomCode() { return Guid.NewGuid().ToString().Substring(0, 4); } /**/ /**/ /**/ /// /// 随机取一个字体 /// /// private Font GetFont() { int fontIndex = _random.Next(0, FontItems.Length); FontStyle fontStyle = GetFontStyle(_random.Next(0, 2)); return new Font(FontItems[fontIndex], 12, fontStyle); } /**/ /**/ /**/ /// /// 取一个字体的样式 /// /// /// private FontStyle GetFontStyle(int index) { switch (index) { case 0: return FontStyle.Bold; case 1: return FontStyle.Italic; default: return FontStyle.Regular; } } /**/ /**/ /**/ /// /// 随机取一个笔刷 /// /// private Brush GetBrush() { int brushIndex = _random.Next(0, BrushItems.Length); _brushNameIndex = brushIndex; return BrushItems[brushIndex]; } /**/ /**/ /**/ /// /// 绘画事件 /// private void OnPaint(HttpApplication context) { Bitmap objBitmap = null; Graphics g = null; try { objBitmap = new Bitmap(Width, Height); g = Graphics.FromImage(objBitmap); Paint_Background(g); Paint_Text(g); Paint_TextStain(objBitmap); Paint_Border(g); objBitmap.Save(context.Response.OutputStream, ImageFormat.Gif); context.Response.ContentType = "image/gif"; } catch { } finally { if (null != objBitmap) objBitmap.Dispose(); if (null != g) g.Dispose(); } } /**/ /**/ /**/ /// /// 绘画背景颜色 /// /// private void Paint_Background(Graphics g) { g.Clear(BackColor); } /**/ /**/ /**/ /// /// 绘画边框 /// /// private void Paint_Border(Graphics g) { g.DrawRectangle(BorderColor, 0, 0, Width - 1, Height - 1); } /**/ /**/ /**/ /// /// 绘画文字 /// /// private void Paint_Text(Graphics g) { g.DrawString(_code, GetFont(), GetBrush(), 3, 1); } /**/ /**/ /**/ /// /// 绘画文字噪音点 /// /// private void Paint_TextStain(Bitmap b) { for (int n = 0; n < 30; n++) { int x = _random.Next(Width); int y = _random.Next(Height); b.SetPixel(x, y, Color.FromName(BrushName[_brushNameIndex])); } } } }