IHttphandler之“验证码”服务器控件
同样,先看下我们的web.config文件:
<httpHandlers>
<add verb="*" path="*.yy" type="Identify.LandpyHttpHander,Identify"/>
</httpHandlers>
首先提个问题大家见过后缀名为“yy”的文件吗,呵呵,这里实际上是使用了一个小技巧。利用IHttphandler来实现服务器端控件的事件,当点击控件时,发送一个“*.yy”路径的请求,从而实现Identify.LandpyHttpHander处理并返回客户端。
下面上代码:
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.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之“验证码”服务器控件相关推荐
- 通过IHttpHandler实现图片验证码
using System; using System.Drawing; using System.Drawing.Imaging; using System.Text; using System.We ...
- EF的水印和验证码图制做
EF的水印和验证码图制做 水印制作 创建IHttpHandler接口 编写水印代码 配置配置文件 创建两个web窗体 最终实现页面 验证码图制作 编写验证码代码 验证码最终效果图 水印制作 创建IHt ...
- IHttpHandler 概述
IHttpHandler 概述 可能和我一样,很多Asp.Net开发人员都有过Asp的背景,以至于我们在开发程序的时候,通常都是在"页面级"上思考,也就是说我们现在正在做的这个页面 ...
- ASP.NET 2.0 HttpHandler实现生成图片验证码(示例代码下载)
学习整理了一下 (一).功能 用HttpHandler实现图片验证码 (二).代码如下 1. 处理程序文件 ValidateImageHandler.ashx代码如下 1 <%@ WebHan ...
- 随机生成6位图片验证码
1. [代码][C#]代码 /// <summary> /// PicHandler1 的摘要说明 /// </summary> public cla ...
- [asp.net]网站数据安全之验证码
数据安全是网站实现必不可少的其中一环,其中最基本的就有防止暴力破解这一类的机器人攻击. 机器人攻击,顾名思义,单纯地由程序算法计算出用户名对应的密码,达到破解账户的功能. 机器人攻击的原理如下: 网页 ...
- Webfrom --图片验证码
(一) 添加一个一般处理程序, <%@ WebHandler Language="C#" Class="show" %>using System; ...
- ASP.NET3种验证码[转]
1.GSC_WebControlLibrary 这是在网上找到的一个控件,非常好用.但是效果不是特别好(见下图. )虽然容易使用,所有的属性都可以像控件一样设置,但是可用性不太高.用户不能自定义,而且 ...
- [ASP.NET 控件实作 Day28] 图形验证码控件
在网页上常把图形验证码应用在登入或贴文的页面中,因为图形验证码具有机器不易识别的特性,可以防止机器人程序恶意的存取网页.在本文中将实作一个图形验证码的服务器控件,透过简单的属性设定就可以轻易地在网页上 ...
最新文章
- 鸡肋的PHP单例模式
- 小蚂蚁学习mysql性能优化(4)--SQL以及索引优化--具体一些优化方法
- Science子刊带来新遗传证据:早期人类驯化了自己
- 包含c语言的序列化字符,Android Serializable与Parcelable原理与区别
- gateway 内存溢出问题_带你学习jvm java虚拟机 arthas/性能调优/故障排除/gc回收/内存溢出等...
- MFC接收命令行参数的三种方法
- java在线音乐播放器课程_[Java教程]15款最好的网站音乐播放器
- perl python文本处理_awk, python, perl文本处理效率对比(zz)
- 入侵sql serve 后拿服务器_quot;条条大路quot;拿webshell
- Netty工作笔记0014---Buffer类型化和只读
- 弃用 Cookie!
- 用DOS的FOR命令高速ping指定的所有局域网机器
- java 删除文件夹和文件_如何创建无法删除的文件夹?
- Ford-Fulkerson Edmonds-Karp算法
- iVX低代码平台系列制作APP简单的个人界面
- 2.2 matlab矩阵变换(对角阵、三角阵、矩阵的转置、矩阵的旋转、矩阵的翻转和矩阵求逆)
- 【图像处理技术】 | 黑科技解读 之 PS检测、弯曲拉平、切边增强、摩尔纹
- 锻造互联网青铜时代 (转)
- 30 行代码实现蚂蚁森林自动收能量(附源码)
- iSpiik产品说:谈谈小程序直播-数据背后几个思考
热门文章
- R中统计假设检验总结
- matlab层次分析法代码_基于主成分分析法和层次分析法的工程项目经理胜任力评价研究...
- php query builder,php – Symfony2 – Doctrine2 QueryBuilder WHERE I...
- 计算机用户名SYSTEN,system是什么用户
- 达而稳 驱动 fl2000dx_Intel-AMD核显驱动没人管:Win10无法升级,不要撞车
- java集合 线程安全
- 《一切皆是映射:代码的本质》哈希算法 (Hash)
- 浅谈PHP-FPM参数
- Java 密码扩展无限制权限策略文件[转]
- JVM快速调优手册v1.0之三:内存分配策略