2024年2月5日发(作者:)
共享一款验证码控件(附详细用法)
最近在完善我的毕业设计——(C#)实现的三层构架的二手交易系统,觉得有必要加上验证码,这样网站的安全性会提升一些。于是利用百度、谷歌反复搜索,终于找到了一款比较牛叉的验证码控件。原作者不详,这里附上一个地址>>>。程序我做了一些小小的修改。
按原文所说的操作,根本编译不了。原文的用法可以查看上面的链接地址,这里我贴出我自己的用法。我将两个类整合到一个.cs文件中了(这里命名为),程序如下:
using System;
using c;
using entModel;
using ;
using ;
using trols;
using ;
using nState;
using g;
using ;
namespace AuthCode
{
[ToolboxData("<{0}:AuthCode runat=server>{0}:AuthCode>")]
public class AuthCode : WebControl
{
/// 〈summary>
/// 获得验证码的值
/// 〈/summary>
/// 〈returns>验证码〈/returns>
public string GetValue()
{
return n["value"].ToString();
}
[Bindable(true)]
[Category("Appearance")]
[Description("验证码字符长度")]
[DefaultValue("ss")]
[Localizable(true)]
//长度
internal static int mySize;
public int MySize
{
get { return ; }
set
{
= value;
}
}
public AuthCode()
: base()//重写父类的构造(输出流的HTML标记)
{ }
protected override void AddAttributesToRender(HtmlTextWriter writer)
{
ributesToRender(writer);//将要输出的的HTML标签的属性和样式添加到指定的 HtmlTextWriter中
leAttribute(, "pointer");//添加样式
ribute("onclick", "='?id='+()");//添加js
ribute(, "");
ribute("alt", "点击刷新");
}
}
public class AuthCodeHttpHander : IHttpHandler, IRequiresSessionState
{
///
/// 返回验证码字符
///
/// 验证码长度
///
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 = (new Char[] { ',' });
string strReturn = "";
Random rnd = new Random();
for (int i = 0; i < codeCount; i++)
{
int j = ();//随机数不能大于数组的长度
strReturn = strReturn + strResult[j].ToString();
}
return strReturn;
}
private Color GetColor()
{
return ;
}
private Bitmap CreateImage(string str_AuthCode)
{
int width = str_ * 13;
int height = 20;
Random rad = new Random();
Bitmap bmp = new Bitmap(width, height);
Graphics grp = age(bmp);// 在图片上绘制图形
();//填充bmp的背景色
ctangle(new Pen(, 1), 0, 0, width - 1, height - 1);//绘制边框
int num = width * height;
for (int i = 0; i < num; i+=3)//在图片的指定坐标上画上有颜色的圆点
{
int x = (width);
int y = (height);
int r = (255);
int g = (255);
int b = (255);
Color c = gb(r, g, b);
el(x, y, c);//在图片的指定坐标上画上有颜色的圆点
}
Font f = new Font("宋体", 12, );//定义字体
Brush br = new SolidBrush();//定义画笔的颜色及字体的颜色
for (int i = 0; i < str_; i++)
{
string s = str_ing(i, 1);//单个单个的将字画到图片上
Point p = new Point(i * 12 + (3), (3) + 1);//字体出现的位置(坐标)
ring(s, f, br, p);//绘制字符串
}
e();
return bmp;//返回
}
///
/// 是否可以处理远程的HTTP请求
///
public bool IsReusable
{
get { return true; }
}
///
/// 将验证码图片发送给WEB浏览器
///
///
public void ProcessRequest(HttpContext context)
{
int size = ; //((String)n["Size"]);
MemoryStream ms = new MemoryStream(); // 创建内存流(初始长度为0 自动扩充)
string NumStr = GetRandomNumberString(size);// 获得验证码字符
("value", NumStr);//将验证码字符保存到session里面
Bitmap theBitmap = CreateImage(NumStr);// 获得验证码图片
(ms, );//将位图写入内存流
ontent(); //清除缓冲区里的所有内容输出
tType = "image/jpeg"; //需要输出图象信息 要修改HTTP头
Write(y()); //将内存流写入HTTP输出流
e(); //释放资源
();//释放资源
e();//释放资源
();
}
}
}
我是这样使用这个验证码控件的:
1:修改 文件
在 <> >间加入下面的代码:
2: “开始”—“运行”—“cmd” ,用下面的两条命令编译文件为.DLL文件。(文件保存在“C:meworkv2.0.50727”目录下) :
cd C:meworkv2.0.50727
csc /target:library
将得到的DLL文件添加到项目的引用中,在“工具箱”中右键点“选择项...”——在.net组件中勾选“AuthCode”(如下图),点确定之后工具箱中就会增加一个AuthCode控件。
将这个控件从工具箱中拖到页面里使用。选中拖出的控件,在其属性中设置MySize即验证码的长度为某一正整数。例如设置成4,自动生成的代码如下(还有自动生成的注册这个控件的代码,这里未列出):
到此,准备工作“基本”完成。(说“基本完成”是因为IIS里漏了一个必要的设置_^)
在.NET2005中通过“文件”—“打开”—“网站”—“本地IIS” 打开(C#)的网站项目,能正常运行页面,验证码控件生成的图片显示不了(只显示一个红叉)。 改用“文件系统”的形式打开则可以正常显示。这个问题我思考了好几天,还到一些技术论坛请教过别人,没人帮我解决(依靠别人是不行的)。这里只贴出那个最早的帖子的地址>>>,在编程论坛、编程爱好者上的帖子就不贴出来了。
我每天都试着去解决一下这个问题,终于慢慢找到了问题的症结。 因为是在用IIS调试时出问题的,所以我猜测问题很有可能就出在IIS的某个设置上。
今天偶然发现IIS里有修改HTTP头的设置,而且上面的程序注释中提到了要修改HTTP头,语句如下:
tType = "image/jpeg"; //需要输出图象信息 要修改HTTP头
同时, 文件中也有对“HTTP头”的设置,设置如下:
于是,我到MSDN里找到了一些与
Microsoft Internet 信息服务 (IIS) 有自己的 ISAPI 映射扩展模型。为使给定应用程序扩展与其处理程序之间的映射生效,该扩展必须在 IIS 中映射为 ISAPI。对于自定义扩展等非标准扩展,则必须相应地配置 IIS。
受上面资料的启发,我又仔细翻查了IIS的设置,发现有个“映射”的设置。加上考虑到这个控件实际生成的是一个.jd的文件(没见过的扩展名...),所以我怀疑用IIS调试显示不了这个验证码图片的症结就在这里
我以“
通过“程序”—>“管理工具”—>“Internet 信息服务”—>选中“默认网站”—>右键点“属性”
—>“主目录”—>“配置”—>“映射”—>“添加”来设置:
路径为: C:meworkv2.0.50727aspnet_
扩展名为: .jd
限制为:GET,HEAD,POST,DEBUG
去掉“检查文件是否存在”前的勾。(必须去掉这里的“√”)
如下图:
。
补充:
一般来说,我们只要在IIS控制台中打开目标网站的属性设置窗口,单击其中的“主目录”标签,在该标签设置页面的“应用程序设置”处单击“配置”按钮,在其后界面中单击“添加”按钮,之后就能根据界面提示完成应用程序扩展名映射添加操作了。然而,有的朋友在打开应用程序扩展名添加对话框后,发现其中的“确定”按钮处于灰色不可用状态;并且,朋友通过“浏览”按钮导入了应用程序详细路径,以及设置了对应程序的扩展名后,发现应用程序扩展名添加对话框中的“确定”按钮依然处于灰色不可选状态。
要想解决这种故障现象,我们只要将鼠标指针移动到图1界面的“可执行文件件”文本框中并进行单击操作,这样我们就会看到压缩路径此时就会自动失效,同时应用程序扩展名映射添加/编辑对话框中的“确定”按钮也就被自动激活了,一旦发现“确定”按钮处于可点击状态时,我们就能成功完成应用程序扩展映射配置操作了。当然,我们如果知道目标应用程序的详细路径时,可以直接采用手工输入的方法输入目标应用程序的路径信息,并且设置好它的扩展名称,这样一来“确定”按钮就不会失效,我们只要单击“确定”按钮,就能将指定的应用程序扩展名映射添加成功了。
发布者:admin,转转请注明出处:http://www.yc00.com/web/1707116069a1477499.html
评论列表(0条)