黑马程序员_学习笔记15_asp.net之验证码实现原理初探

来源:互联网 发布:西安网络招聘信息 编辑:程序博客网 时间:2024/05/16 01:50
---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------------------

验证码这个功能的出现是为了 防止暴力机器人 不断的象网站提交注册或登陆,以及发帖信息。

因为 不对用户能够访问到服务器内存(也就是后台处理代码)的路径加以限制的话,那么暴力机器人的这种行为很有可能导致

服务器内存溢出,最终导致服务器崩溃。这对任何一个网站开发人员来说,是必须严厉禁止的问题。验证码的出现就防止了

这类问题的产生。


在ASP.NET中 ,动态的穿件验证码一般都是使用一般处理文件的模式。

在一般处理文件里动态生成随机数,或者是生成别的什么东西之后,使用一个session保存

当前生成的值,然后在使用.NET提供的Drawing工具动态的生成图片的形式,将动态

生成的验证法,发送到客户端。

当客户端用户提交表单之后,会根据用户提交过来的验证码和存放在session中的验证码进行对比,

来判断用户输入的验证码是否正确。


因为一般处理文件,不是归属于asp.net框架技术下的,所以 它不能直接的使用ASP.NET框架直接为

我们提供的session功能,不过ASP.NET也想到了这一点。你只需要将你的当前托管类除了实现IHttphandler

接口以外,在实现一个在System.Web.SessionState控件下的IRequiresSessionState接口就行了。

IRequiresSessionState接口是一个没有定义任何接口成员的接口,它提供了 在一般处理文件中也能

使用ASP.NET框架中Session的功能。


下面我们来做个验证码的例子:

首先是一般处理文件:yzm.ashx

public class yzm:IHttpHandler,System.Web.SessionState.IRequiresSessionState

{

         //我们在这里使用文字版的验证码

         string[ ] yzms ={"太极无极","两仪化形","三才化生","四象轮回","五行方尽","六合独尊","七星拱瑞","八卦洞穴","九转归一"};

         //然后在使用System.Drawing命名空间下的各种画图功能来将文字内容画到画板上

         //假定我已经引入了Drawing命名空间

         public void ProcessRequest (HttpContext context) {

          //响应格式设置成image/jpeg

          context.Response.ContentType = "image/jpeg";

         using(BItMap bitmap = new Bitmap(180,50))

         {

                       using(Graphics grap = Graphics.FromImage(bitmap))

                       {

                                    Random rand = new Random();
                                    int i = rand.Next(yzms.Length);

                                   //将当前验证码的实际内容存放在session中

                                    HttpContext.Current.Session["yzm"] = yzms[i];

                                    grap.DrawString(yzms[i], new Font("宋体", 30), Brushes.Green, new PointF(0, 0));
                                    grap.DrawEllipse(new Pen(Brushes.Honeydew),new Rectangle(20,20,10,10));

                                    //把当前图片绑定到响应流中

                                    bitmap.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);

                       }

         }

    }

}

然后在到aspx页面中使用session来判断用户输入的验证码是否正确:

文件名:测试验证码.aspx

这是前面的html标签,使用一个img 来象YZM一般处理文件请求一张验证码图片。


这是后台代码

使用Session["yzm"]来取得服务器为当前用户在一般处理文件里随即到的成语,

然后和用户输入的成语进行对比,正确就给正确提示,失败就给失败提示。


运行该页面:

当输入正确时:

当输出错误时:

这样一个验证码完整的例子就做出来了。

如果你想能够自己彻底的做出这么一个效果出来,那么必须要对cookie和session非常了解才行。

---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------------------
详细请查看:http://net.itheima.com/
原创粉丝点击