当前位置: 首页 > news >正文

在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 }

 

转载于:https://www.cnblogs.com/xinhuan/p/4817355.html

相关文章:

  • 微软Visual Studio Code 0.8.0发布,新增多种主题
  • Tomcat中部署WEB项目的四种方法
  • jquery带有参照数据的效果处理
  • PHP版本中的VC6,VC9,VC11,TS,NTS区别
  • Java编程思想学习笔记——字符串
  • 《构建执法》要点总结
  • iOS开发和Android开发的相似之处
  • 《mysql性能调优与架构设计》笔记:三mysql 安全管理
  • Spark和hadoop的关系
  • java7 API详解
  • DNS与BIND
  • 小组级git服务器的搭建
  • hdu 5491(位运算)
  • easyUI datetimebox 自定义显示格式
  • genymotion在后台总是打印这个错误的log 有大神知道怎么解决吗
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 【RocksDB】TransactionDB源码分析
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • Asm.js的简单介绍
  • CSS 三角实现
  • Java 23种设计模式 之单例模式 7种实现方式
  • JavaWeb(学习笔记二)
  • opencv python Meanshift 和 Camshift
  • scala基础语法(二)
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 爬虫进阶 -- 神级程序员:让你的爬虫就像人类的用户行为!
  • 什么是Javascript函数节流?
  • 应用生命周期终极 DevOps 工具包
  • 栈实现走出迷宫(C++)
  • 正则表达式小结
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • #### go map 底层结构 ####
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • (Note)C++中的继承方式
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (二十三)Flask之高频面试点
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (五)IO流之ByteArrayInput/OutputStream
  • (转载)CentOS查看系统信息|CentOS查看命令
  • .net core 6 集成和使用 mongodb
  • .NET MVC 验证码
  • .Net 代码性能 - (1)
  • .NET 依赖注入和配置系统
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .NET设计模式(11):组合模式(Composite Pattern)
  • /bin、/sbin、/usr/bin、/usr/sbin
  • ??eclipse的安装配置问题!??
  • @property python知乎_Python3基础之:property
  • @WebService和@WebMethod注解的用法