在ASP.NET中使用一般处理程序生成验证码
2015-09-17 18:52
656 查看
如果期望一般处理程序(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();因为浏览器处理相同的请求的时候是优先从缓存中读取的,这样浏览器会为每次请求都发送请求,而不是从缓存中读取。
服务器端
生成随机码的方法:
ashx中的处理过程
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 = 0; 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(4); //把验证码写入Session context.Session["validateCode"] = validateCode; //创建验证码图片 using (Bitmap img = new Bitmap(100, 40)) { //获取背景验证码的背景图片路径 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), 0, 0, img.Width, img.Height); //将验证码字符串写入图片 g.DrawString(validateCode, new Font("微软雅黑", 16, FontStyle.Italic), Brushes.Black, 5, 5); //将验证码图片保存至响应流,客户端就能看到这个图片了 img.Save(context.Response.OutputStream, ImageFormat.Jpeg); } } } }
相关文章推荐
- asp.net动态设置标题title 关键字keywords 描述descrtptions
- Spring AOP - AspectJ - @AfterThrowing example
- asp.net mvc 5 web api 关于Requested resource does not support options 问题
- ASP.NET MVC5网站开发显示文章列表(九)
- asp.net 根据dataset获取大字符串(直接转出json)
- ASP.NET - List<> 绑定 DropDownList
- asp.net 处理F5刷新页面重复提交页面的一个思路
- ASP.NET - TreeView 增删
- ASP.NET站点导航应用详解
- ASP.NET MVC3 通过URL路由传多个参数方法
- [C#/ASP.NET]List<>中Sort()、Find()、FindAll()、Exist()的使用方法
- ASPX页面传值
- ASP CDONTS.NEWMAIL组件发送电邮(附下载)
- Asp.net Response.Redirect with post data
- Spring AOP - AspectJ - @AfterReturning example
- [ASP.NET]谈谈IIS与ASP.NET管道
- Spring AOP - AspectJ - @After example
- Spring AOP - AspectJ - @Before example
- ASP.NET实现级联下拉框效果实例讲解
- Spring AOP + AspectJ annotation example