同样,先看下我们的web.config文件:

<httpHandlers>
      <add verb="*" path="*.yy" type="Identify.LandpyHttpHander,Identify"/>
 </httpHandlers>

首先提个问题大家见过后缀名为“yy”的文件吗,呵呵,这里实际上是使用了一个小技巧。利用IHttphandler来实现服务器端控件的事件,当点击控件时,发送一个“*.yy”路径的请求,从而实现Identify.LandpyHttpHander处理并返回客户端。

下面上代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using System.Web.SessionState;

namespace Identify
{
    [DefaultProperty("Text")]
    [ToolboxData("<{0}:LandpyIdentityControl runat=server></{0}:LandpyIdentityControl>")]
    public class LandpyIdentityControl : WebControl
    {
        [Bindable(true)]
        [Category("Appearance")]
        [DefaultValue("")]
        [Localizable(true)]
        public string Text
        {
            get
            {
                String s = (String)ViewState["Text"];
                return ((s == null) ? String.Empty : s);
            }

set
            {
                ViewState["Text"] = value;
            }
        }

internal static int _wordLength;

[Description("验证码长度")]
        public int WordLength
        {
            get { return LandpyIdentityControl._wordLength; }
            set
            {
                LandpyIdentityControl._wordLength = value;

}
        }

internal static string _value;

[Description("验证码内容")]
        public string Value
        {
            get { return LandpyIdentityControl._value; }
        }

protected override void RenderContents(HtmlTextWriter output)
        {
            //output.Write(Text);           
        }

public LandpyIdentityControl()
            : base(HtmlTextWriterTag.Img)//重写父类的构造(输出流的HTML标记设置为图像类型)
        { }

protected override void AddAttributesToRender(HtmlTextWriter writer)
        {
            base.AddAttributesToRender(writer);
            writer.AddStyleAttribute(HtmlTextWriterStyle.Cursor, "pointer");
            writer.AddAttribute("onclick", "this.src='img.yy?id='+Math.random()");
            writer.AddAttribute(HtmlTextWriterAttribute.Src, "img.yy");
            writer.AddAttribute("alt", "点击刷新");
        }
    }
}

下面是处理类:

using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Web.UI.WebControls;
using System.Web.UI;
using System.Web.SessionState;
using System.Drawing;
using System.IO;

namespace Identify
{
    public class LandpyHttpHander : IHttpHandler, IRequiresSessionState
    {
        /// <summary>
        /// 返回验证码字符
        /// </summary>
        /// <param name="codeCount">验证码长度</param>
        /// <returns></returns>
        private string GetRandomNumberString(int codeCount)
        {
            string strChoice = "2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,T,U,V,W,X,Y,Z";
            string[] strResult = strChoice.Split(new Char[] { ',' });
            string strReturn = "";
            Random rnd = new Random();
            for (int i = 0; i < codeCount; i++)
            {
                int j = rnd.Next(strResult.Length);
                strReturn = strReturn + strResult[j].ToString();
            }
            return strReturn;
        }

private Color GetColor()
        {
            return Color.Black;
        }

private Bitmap CreateImage(string str_AuthCode)
        {
            int width = str_AuthCode.Length * 21;
            int height = 30;
            Random rad = new Random();
            Bitmap bmp = new Bitmap(width, height);
            Graphics grp = Graphics.FromImage(bmp);// 在图片上绘制图形
            grp.Clear(Color.LightGreen);
            grp.DrawRectangle(new Pen(Color.DarkGreen, 1), 0, 0, width - 1, height - 1);
            //画图片的背景噪音线
            for (int i = 0; i < 15; i++)
            {
                int x1 = rad.Next(width);
                int x2 = rad.Next(width);
                int y1 = rad.Next(height);
                int y2 = rad.Next(height);

grp.DrawLine(new Pen(Color.Black), x1, y1, x2, y2);
            }
            //画图片的前景噪音点
            for (int i = 0; i < 100; i++)
            {
                int x = rad.Next(width);
                int y = rad.Next(height);

bmp.SetPixel(x, y, Color.Black);
            }
            Font f = new Font("宋体", 20, FontStyle.Bold);
            Brush br = new SolidBrush(Color.Black);
            for (int i = 0; i < str_AuthCode.Length; i++)
            {
                string s = str_AuthCode.Substring(i, 1);
                Point p = new Point(i * 20 + rad.Next(3), rad.Next(3) + 1);
                grp.DrawString(s, f, br, p);
            }
            grp.Dispose();
            return bmp;

}

/// <summary>
        /// 是否可以处理远程的HTTP请求
        /// </summary>
        public bool IsReusable
        {
            get { return true; }
        }

/// <summary>
        /// 将验证码图片发送给WEB浏览器
        /// </summary>
        /// <param name="context"></param>
        public void ProcessRequest(HttpContext context)
        {
            int size = LandpyIdentityControl._wordLength; //Int32.Parse((String)context.Session["Size"]);
            MemoryStream ms = new MemoryStream();
            string NumStr = GetRandomNumberString(size);
            LandpyIdentityControl._value = NumStr;
            //context.Session.Add("value", NumStr);//将验证码字符保存到session里面
            Bitmap theBitmap = CreateImage(NumStr);
            theBitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
            context.Response.ClearContent();
            context.Response.ContentType = "image/jpeg"; //需要输出图象信息 要修改HTTP头为jpeg类型 
            context.Response.BinaryWrite(ms.ToArray()); 
            theBitmap.Dispose();
            ms.Close();
            ms.Dispose();
            context.Response.End();
        }

}
}

其中验证码图片的生成随便copy了下,实际就是GDI+实现DrawString方法。如果对GDI+有了解相信会很容易理解的。

这样“验证码”服务器控件就OK了,如果要使用,引入相应的Dll,设置下web.config,设置下控件的字符个数就可以使用了,很简单。

在设计视图中,自定义服务器控件的属性可以赋初始值。比如我们的控件属性:

[Description("验证码长度")]
        public int WordLength
        {
            get { return LandpyIdentityControl._wordLength; }
            set
            {
                LandpyIdentityControl._wordLength = value;

}
        }

可以设置验证码的长度。

另外,自定义控件是从WebControl继承,可以重写很多方法,比如RenderControl,RenderContents,AddAttributesToRender等,各个方法的作用可以查阅相关资料,本文不再说明。其中,对于UI来说RenderXXXX一系列方法是很重要的,如同Winfrom程序中的OnPrint方法一样。

快去做自己喜欢的控件吧:)

转载于:https://www.cnblogs.com/pangxiaoliang/archive/2009/06/28/1512720.html

IHttphandler之“验证码”服务器控件相关推荐

  1. 通过IHttpHandler实现图片验证码

    using System; using System.Drawing; using System.Drawing.Imaging; using System.Text; using System.We ...

  2. EF的水印和验证码图制做

    EF的水印和验证码图制做 水印制作 创建IHttpHandler接口 编写水印代码 配置配置文件 创建两个web窗体 最终实现页面 验证码图制作 编写验证码代码 验证码最终效果图 水印制作 创建IHt ...

  3. IHttpHandler 概述

    IHttpHandler 概述 可能和我一样,很多Asp.Net开发人员都有过Asp的背景,以至于我们在开发程序的时候,通常都是在"页面级"上思考,也就是说我们现在正在做的这个页面 ...

  4. ASP.NET 2.0 HttpHandler实现生成图片验证码(示例代码下载)

    学习整理了一下 (一).功能 用HttpHandler实现图片验证码 (二).代码如下 1. 处理程序文件 ValidateImageHandler.ashx代码如下  1 <%@ WebHan ...

  5. 随机生成6位图片验证码

    1. [代码][C#]代码  /// <summary>     /// PicHandler1 的摘要说明     /// </summary>     public cla ...

  6. [asp.net]网站数据安全之验证码

    数据安全是网站实现必不可少的其中一环,其中最基本的就有防止暴力破解这一类的机器人攻击. 机器人攻击,顾名思义,单纯地由程序算法计算出用户名对应的密码,达到破解账户的功能. 机器人攻击的原理如下: 网页 ...

  7. Webfrom --图片验证码

    (一) 添加一个一般处理程序, <%@ WebHandler Language="C#" Class="show" %>using System; ...

  8. ASP.NET3种验证码[转]

    1.GSC_WebControlLibrary 这是在网上找到的一个控件,非常好用.但是效果不是特别好(见下图. )虽然容易使用,所有的属性都可以像控件一样设置,但是可用性不太高.用户不能自定义,而且 ...

  9. [ASP.NET 控件实作 Day28] 图形验证码控件

    在网页上常把图形验证码应用在登入或贴文的页面中,因为图形验证码具有机器不易识别的特性,可以防止机器人程序恶意的存取网页.在本文中将实作一个图形验证码的服务器控件,透过简单的属性设定就可以轻易地在网页上 ...

最新文章

  1. 鸡肋的PHP单例模式
  2. 小蚂蚁学习mysql性能优化(4)--SQL以及索引优化--具体一些优化方法
  3. Science子刊带来新遗传证据:早期人类驯化了自己
  4. 包含c语言的序列化字符,Android Serializable与Parcelable原理与区别
  5. gateway 内存溢出问题_带你学习jvm java虚拟机 arthas/性能调优/故障排除/gc回收/内存溢出等...
  6. MFC接收命令行参数的三种方法
  7. java在线音乐播放器课程_[Java教程]15款最好的网站音乐播放器
  8. perl python文本处理_awk, python, perl文本处理效率对比(zz)
  9. 入侵sql serve 后拿服务器_quot;条条大路quot;拿webshell
  10. Netty工作笔记0014---Buffer类型化和只读
  11. 弃用 Cookie!
  12. 用DOS的FOR命令高速ping指定的所有局域网机器
  13. java 删除文件夹和文件_如何创建无法删除的文件夹?
  14. Ford-Fulkerson Edmonds-Karp算法
  15. iVX低代码平台系列制作APP简单的个人界面
  16. 2.2 matlab矩阵变换(对角阵、三角阵、矩阵的转置、矩阵的旋转、矩阵的翻转和矩阵求逆)
  17. 【图像处理技术】 | 黑科技解读 之 PS检测、弯曲拉平、切边增强、摩尔纹
  18. 锻造互联网青铜时代 (转)
  19. 30 行代码实现蚂蚁森林自动收能量(附源码)
  20. iSpiik产品说:谈谈小程序直播-数据背后几个思考

热门文章

  1. R中统计假设检验总结
  2. matlab层次分析法代码_基于主成分分析法和层次分析法的工程项目经理胜任力评价研究...
  3. php query builder,php – Symfony2 – Doctrine2 QueryBuilder WHERE I...
  4. 计算机用户名SYSTEN,system是什么用户
  5. 达而稳 驱动 fl2000dx_Intel-AMD核显驱动没人管:Win10无法升级,不要撞车
  6. java集合 线程安全
  7. 《一切皆是映射:代码的本质》哈希算法 (Hash)
  8. 浅谈PHP-FPM参数
  9. Java 密码扩展无限制权限策略文件[转]
  10. JVM快速调优手册v1.0之三:内存分配策略