阅读文章

雕虫小技--验证码控件

[日期:2008-04-18] 来源:  作者: [字体: ]

     主题
  雕虫小技--自定义“验证码”控件
  
   “验证码”在登录的时候,经常用到,如果把“她”封装成控件,是不是很爽呢?但是,我一般不喜欢封装得太厉害的“她”,因为什么都看不到,亦或看起来比较朦胧:)
  切入点
  利用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处理,这不是我们所要的.
  
  最后
  什么也不说了,如果觉得对您有用,请给点鼓励...  


阅读:
录入:blue1000

评论 】 【 推荐 】 【 打印
上一篇:WCF基础知识问与答
下一篇:不定时的间隔线程和线程排队执行(LumaQQ.NET异步线程处理)
相关文章      
本文评论
  好啊   (zhao ,2008-04-20 )
发表评论


点评: 字数
姓名:

  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款