• 【C#.NET】自定义“验证码”控件(转)


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

    切入点
    利用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处理,这不是我们所要的.
  • 相关阅读:
    JavaCV入门指南之快速上手篇:快速上手视频拉流、推流、录制文件、录屏、截图和编解码复用解复用等常用音视频处理操作
    javacv开发详解补充篇:如何将rgb/bgr像素数据优雅高效的转换为BufferedImage
    JavaCV开发详解之21:如何使用JavaCV接入gb28181的ps流并推流到流媒体服务和接入海康大华sdk回调h264/hevc裸流
    javacv开发详解补充篇:解决转流后视频画面快进慢放,时间跳动过大,监控视频时间戳重新计算pts和dts
    为啥你写的文章没人看?关于内容创作的两大玄学分析:认真写的没人看,随便写的火的一塌糊涂
    JavaCV进阶opencv图像检测识别:ffmpeg视频图像画面人脸检测
    JavaCV进阶opencv图像检测识别:摄像头图像人脸检测
    「Elasticsearch」ES重建索引怎么才能做到数据无缝迁移呢?
    【手记】让Fiddler捕获到SQLCLR中的网络请求
    .Net程序连接SQL Server默认会话选项备查
  • 原文地址:https://www.cnblogs.com/cuishao1985/p/1573308.html
Copyright © 2020-2023  润新知