zoukankan      html  css  js  c++  java
  • 在ASP.NET中使用一般处理程序生成验证码

     

      如果期望一般处理程序(ashx)处理Session,必须实现【System.Web.SessionState】命名空间下的【IRequiresSessionState】接口。

      asp.net中的验证码一般是通过请求ashx页面来完成的,将ashx的上下文对象的响应类型设置为"image/jpeg".使用Random类是随机生成一个字符串,把这个字符串写入到一张图片并保存到Session中,再将图片保存到响应流的输出中,这样每次客户端就会请求到一个验证码的图片了。

     

    下面是我的具体实现:

    客户端

      把验证码图片的src属性指向ashx验证码处理程序的路径,点击图片或"看不清"实现换图的功能是通过改变验证码图片的src属性实现。在每次更换验证码时,为了避免缓存而未发出请求,需要在src属性的URL末尾加个不固定的参数,如:this.src="getValidateCode.ashx?t="+new Date();因为浏览器处理相同的请求的时候是优先从缓存中读取的,这样浏览器会为每次请求都发送请求,而不是从缓存中读取。


    服务器端

    生成随机码的方法:

     1 private string getValidateCode(int validateCodeLength)
     2 {
     3   // 定义可能出现的所有字符串,实际应用中有些字符很难区分,如0和o,可以去掉。
     4   string allChars = @"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
     5   // 获取所有字符的长度
     6   int charsLength = allChars.Length;
     7   
     8   string validateCode = string.Empty;
     9   // 声明随机数生成器
    10   Random ran = new Random();
    11   //循环的次数代表生成的随机字符串的长度
    12   for (int i = 0; i < validateCodeLength; i++)
    13   {
    14     //将随机产生的数字作为字符串的索引,从而可以获得其下标所在的字符,并将这个字符加到随机字符串上
    15     validateCode += allChars[ran.Next(charsLength)];
    16   }
    17   //返回字符串
    18   return validateCode;
    19 }


    ashx中的处理过程

     1 public void ProcessRequest(HttpContext context)
     2 {
     3   //将响应类型设置成图片
     4   context.Response.ContentType = "image/jpeg";
     5   //获取一个4位数的验证码
     6   string validateCode = getValidateCode(4);
     7   //把验证码写入Session
     8   context.Session["validateCode"] = validateCode;
     9   //创建验证码图片
    10   using (Bitmap img = new Bitmap(100, 40))
    11   {
    12     //获取背景验证码的背景图片路径
    13     string bgPath = context.Server.MapPath("~/image/bg.gif");
    14     using (Bitmap bg = new Bitmap(bgPath))
    15     {
    16       using (Graphics g = Graphics.FromImage(img))
    17       {
    18         //使用背景图片画刷填充验证码图片
    19         g.FillRectangle(new TextureBrush(bg), 0, 0, img.Width, img.Height);
    20         //将验证码字符串写入图片
    21         g.DrawString(validateCode, new Font("微软雅黑", 16, FontStyle.Italic), Brushes.Black, 5, 5);
    22         //将验证码图片保存至响应流,客户端就能看到这个图片了
    23         img.Save(context.Response.OutputStream, ImageFormat.Jpeg);
    24       }
    25     }
    26   }
    27 }
  • 相关阅读:
    都说程序员钱多空少,程序员真的忙到没时间回信息了吗?
    C/C++知识分享: 函数指针与指针函数,看完这篇你还能不懂?
    C++的那些事儿:从电饭煲到火箭,C++无处不在
    年薪90万程序员不如月入3800公务员?安稳与高收入,到底如何选择?
    【C++学习笔记】C++ 标准库 std::thread 的简单使用,一文搞定还不简单?
    C语言既有高级语言又有低级语言的特点,但为什么它不是低级语言呢?
    【C++学习笔记】看完这篇,C++ 的链接问题不怕你搞不明白!
    既然C++这么难学,为什么还有人“自讨苦吃”?
    编程语言这么多,为什么就只有C 语言能一直得到 SQLite 的青睐?
    初学者疑惑:C语言中,函数反复调用会有什么问题?
  • 原文地址:https://www.cnblogs.com/xinhuan/p/4817355.html
Copyright © 2011-2022 走看看