“验证码”在登录的时候,经常用到,如果把“她”封装成控件,是不是很爽呢?但是,我一般不喜欢封装得太厉害的“她”,因为什么都看不到,亦或看起来比较朦胧:) 切入点 利用IHttpHandler接口,动态生成验证码 图一(直接看效果吧) 看代码吧 步骤一(新建一类库) Code using System; using System.Collections.Generic; using System.Text; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Drawing; namespace ControlValidater { public class CValidater:IHttpHandler,IRequiresSessionState { HttpResponse response = null; HttpSessionState sessionState = null; public void ProcessRequest(HttpContext context) { response = context.Response; sessionState = context.Session; this.GenImg(this.GenCode(4)); } bool System.Web.IHttpHandler.IsReusable { get { return true; } } //产生随机字符串 private string GenCode(int num) { string[] source ={"0","1","2","3","4","5","6","7","8","9", "A","B","C","D","E","F","G","H","I","J","K","L","M","N", "O","P","Q","R","S","T","U","V","W","X","Y","Z"}; string code = ""; Random rd = new Random(); for (int i = 0; i < num; i++) { code += source[rd.Next(0, source.Length)]; } return code; } //生成图片 private void GenImg(string code) { Bitmap myPalette = new Bitmap(60, 20);//定义一个画板 Graphics gh = Graphics.FromImage(myPalette);//在画板上定义绘图的实例 Rectangle rc = new Rectangle(0, 0, 60, 20);//定义一个矩形 gh.FillRectangle(new SolidBrush(Color.Silver), rc);//填充矩形 gh.DrawString(code, new Font("宋体", 16), new SolidBrush(Color.Gray), rc);//在矩形内画出字符串 myPalette.Save(response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);//将图片显示出来 sessionState["ValidateCode"] = code;//将字符串保存到Session中,以便需要时进行验证 gh.Dispose(); myPalette.Dispose(); } } } 步骤二(使用方法) 直接引用编译后的dll文件 在web.config的web节点,加入<httpHandlers>元素, 例如 Code <httpHandlers> <add path="CValidater.aspx" verb="*" type="ControlValidater.CValidater" /> </httpHandlers> 当然,如果直接把类库作为一个普通类,放在使用的Website的App_Data目录的话,就不需要配置了:) 步骤三(使用方法) 在需要使用验证码的页面,扔一个image标记,然后把他的url指向"类名.aspx" 例如 Code <asp:Image ID="Image1" runat="server" ImageUrl="~/CValidater.aspx"/> 到此配置完成,是不是很简单呢:) 哎... 还是把最后一个步骤代码贴出来吧. Code protected void Button1_Click(object sender, EventArgs e) { string strIn = this.TextBox1.Text; string strSess = Session["ValidateCode"].ToString(); if (strIn == strSess) Button1.Text = "ok"; else Button1.Text = "error"; } 需要注意的几个地方:) 一,记得要实现IRequiresSessionState接口,虽然她只是一个标记,没有她,Session状态无法使用. 二,HttpSessionState的对象是通过上下文获得的. 三,配制config的时候,不要忘记path="CValidater.aspx",如果path="*.aspx",那你所有的页面都将被CValidater处理,这不是我们所要的.
自定义“验证码”控件
最新推荐文章于 2021-06-15 17:16:56 发布