如果期望一般处理程序(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();因为浏览器处理相同的请求的时候是优先从缓存中读取的,这样浏览器会为每次请求都发送请求,而不是从缓存中读取。

服务器端

生成随机码的方法:

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

ashx中的处理过程

 public void ProcessRequest(HttpContext context)
{
  //将响应类型设置成图片
  context.Response.ContentType = "image/jpeg";
  //获取一个4位数的验证码
  string validateCode = getValidateCode();
  //把验证码写入Session
  context.Session["validateCode"] = validateCode;
  //创建验证码图片
  using (Bitmap img = new Bitmap(, ))
  {
    //获取背景验证码的背景图片路径
    string bgPath = context.Server.MapPath("~/image/bg.gif");
    using (Bitmap bg = new Bitmap(bgPath))
    {
      using (Graphics g = Graphics.FromImage(img))
      {
        //使用背景图片画刷填充验证码图片
        g.FillRectangle(new TextureBrush(bg), , , img.Width, img.Height);
        //将验证码字符串写入图片
        g.DrawString(validateCode, new Font("微软雅黑", , FontStyle.Italic), Brushes.Black, , );
        //将验证码图片保存至响应流,客户端就能看到这个图片了
        img.Save(context.Response.OutputStream, ImageFormat.Jpeg);
      }
    }
  }
}

在ASP.NET中使用一般处理程序生成验证码的更多相关文章

  1. asp.net中的比较完美的验证码

    要实现如图的效果的验证码,分以下步骤: 第一.布局好调用验证码的登录页面(命名:Login.aspx),注意:验证码位置可以是服务器控件 Image,也可以是html标签写的<img>,但 ...

  2. asp.net中ashx生成验证码代码放在Linux(centos)主机上访问时无法显示问题

    最近有个项目加入了验证码功能,就从自己博客以前的代码中找到直接使用,直接访问验证码页面报错如下: 源代码:asp.net中使用一般处理程序生成验证码 Application Exception Sys ...

  3. ASP.NET中常用的优化性能的方法

    1. 数据库访问性能优化 数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源.ASP.NET中提供了连接池( ...

  4. ASP.NET中Session的sessionState 4种mode模式

    1. sessionState的4种mode模式 在ASP.NET中Session的sessionState的4中mode模式:Off.InProc.StateServer及SqlServer. 2. ...

  5. Asp.net中存储过程拖拽至dbml文件中,提示无法获得返回值

    Asp.net中存储过程拖拽至dbml文件中,提示无法获得返回值,去属性表中设置这时候会提示你去属性表中更改返回类型. 其实存储过程返回的也是一张表,只不过有时候存储过程有点复杂或者写法不规范的话不能 ...

  6. ASP.NET中后台数据和前台控件的绑定

    关于ASP.NET中后台数据库和前台的数据控件的绑定问题 最近一直在学习个知识点,自己创建了SQL Server数据库表,想在ASP.NET中连接数据库,并把数据库中的数据显示在前台,注意,这里的数据 ...

  7. asp.net中缓存的使用介绍一

    asp.net中缓存的使用介绍一 介绍: 在我解释cache管理机制时,首先让我阐明下一个观念:IE下面的数据管理.每个人都会用不同的方法去解决如何在IE在管理数据.有的会提到用状态管理,有的提到的c ...

  8. ASP.NET中Ajax的用法

    在ASP.NET中应用Ajax的格式如下: 前台代码(用JQuery库) $.ajax({ type: "POST", async: true, url: "../Aja ...

  9. Asp.Net中使用OpenRowSet操作Excel表,导入Sql Server(实例)

    有两种接口可供选择:Microsoft.Jet.OLEDB.4.0(以下简称 Jet 引擎)和Microsoft.ACE.OLEDB.12.0(以下简称 ACE 引擎). Jet 引擎大家都很熟悉,可 ...

随机推荐

  1. HTTP协议学习-02

    HTTP 协议详解之 URL 的组成 http(超文本传输协议)是一个基于请求与响应模式的.无状态的.应用层的协议,常基于 TCP 的连接方式,HTTP1.1 版本中给出一种持续连接的机制,绝大多数的 ...

  2. mysql通过SOURCE导入SQL时报错处理

    ERROR: unknown command '\n' Can't connect to the server 网上查询了,多少是编码问题引起,一边是UTF8一边是GBK,反复调整MY.CNF配置文件 ...

  3. 14.1.1 使用InnoDB 表的好处:

    14.1.1 Benefits of Using InnoDB Tables 14.1.2 Best Practices for InnoDB Tables 14.1.3 Checking InnoD ...

  4. UNDO 100%

    另外查了下v$undostat,发现begin_time已经很久没有改变, BEGIN_TIME           END_TIME             MAXQUERYLEN MAXCONCU ...

  5. BZOJ 1023 [SCOI2009]生日快乐

    1024: [SCOI2009]生日快乐 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1729  Solved: 1219[Submit][Statu ...

  6. BZOJ1984: 月下“毛景树”

    1984: 月下“毛景树” Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 713  Solved: 245[Submit][Status] Descri ...

  7. 【转】(DT系列一)DTS结构及其编译方法----不错

    原文网址:http://www.cnblogs.com/biglucky/p/4057476.html DTS结构及其编译方法 一:主要问题 1,需要了解dtsi与dts的关系 2,dts的结构模型 ...

  8. [Design Pattern] Observer Pattern 简单案例

    Observer Pattern,即观察者模式,当存在一对多关系,例如一个对象一有变动,就要自动通知被依赖的全部对象得场景,属于行为类的设计模式. 下面是一个观察者模式的简单案例. Observer ...

  9. jenkins 设置权限后管理员登陆提示:Access Denied admin没有Overall/Read权限

    jenkins 设置权限后,管理员登陆提示:Access Denied  admin没有Overall/Read权限 处理办法: window下编辑 xml 配置文件: %userprofile%\. ...

  10. UVa 10617 Again Palindromes / 记忆化搜索

    删除若干个字母后 剩下的是回文串 求有多少个 记忆化搜索 dp[i][j]表示i j 之间有多少个 其实递推也可以的 long long #include <stdio.h> #inclu ...