自定义“验证码”控件(转)


    “验证码”在登录的时候,经常用到,如果把“她”封装成控件,是不是很爽呢?
但是,我一般不喜欢封装得太厉害的“她”,因为什么都看不到,亦或看起来比较朦胧:)

切入点
利用IHttpHandler接口,动态生成验证码

图一(直接看效果吧)

看代码吧

步骤一(新建一类库)


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(6020);//定义一个画板

            Graphics gh 
= Graphics.FromImage(myPalette);//在画板上定义绘图的实例

            Rectangle rc 
= new Rectangle(006020);//定义一个矩形

            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>元素,
例如


<httpHandlers>

      
<add path="CValidater.aspx" verb="*" type="ControlValidater.CValidater" />
    
</httpHandlers>

当然,如果直接把类库作为一个普通类,放在使用的Website的App_Data目录的话,就不需要配置了:)

步骤三(使用方法)
在需要使用验证码的页面,扔一个image标记,然后把他的url指向"类名.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处理,这不是我们所要的.
posted @ 2008-04-17 22:41  yangjun  阅读(440)  评论(0编辑  收藏  举报