using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Drawing;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Web.SessionState;
namespace yzm
{
/// <summary>
/// yzm 的摘要说明
/// </summary>
public class yzm : IHttpHandler,IRequiresSessionState
{
private const string yzmName = "yzm"; public void ProcessRequest(HttpContext context)
{ //表头需要修改 MIME类型为:image/jpeg,因为此页面要以图片流的形式响应给客户端
context.Response.ContentType = "image/jpeg"; //获取验证码的内容
string code = CreateCode(context, ); //将内容保存到Seesion,在效验时取客户端提交的值在服务器里与此Session内容验证
context.Session[yzmName] = code; /*
绘制样式
*/
using (Bitmap map =new Bitmap (,)) //创建位图对象,构造函数指定宽、高
using(Graphics grap=Graphics.FromImage(map)) //创建绘图的图纸 {
grap.Clear(Color.White); //让图纸为白色 /*创建一个矩形对象
构造函数(x坐标,y坐标,宽,高)
* 该参数的填写,其实是填满了整个图纸
*/
Rectangle rec = new Rectangle(,,map.Width,map.Height); /*创建了一个画线性,并且颜色是渐变的一个画笔对象
构造函数: 画在矩形对象上,起始颜色,结束颜色,角度,是否比例
*/
using (LinearGradientBrush brush = new LinearGradientBrush(rec,Color.Blue,Color.Red,1.2f,true))
using( Font font = new Font("隶书", , FontStyle.Strikeout)) //为验证码指定字体
{
grap.DrawString(code, font, brush, , ); //画到图纸上,传入相应对象:内容、字体、画笔、坐标
} //画一些随机的直线,增加验证码识别度
Random random = new Random();
for (int i = ; i < ; i++)
{
//第一个点
int x1 = random.Next(map.Width);
int y1 = random.Next(map.Height); //第二个点
int x2 = random.Next(map.Width);
int y2 = random.Next(map.Height); /*在画纸上绘画线
* 构造函数:
* pen:创建画笔(画笔颜色,宽度)
x1, y1, x2, y2 随机生成 两个坐标点连成一条线
*/
grap.DrawLine(new Pen(Color.FromArgb(random.Next()), ), x1, y1, x2, y2); } //保存到响应对象的流中 ,返回给客户端一个jpg格式图片
map.Save(context.Response.OutputStream, ImageFormat.Jpeg); } //--end } /// <summary>
/// 用txt里的汉字作为验证码数据源
/// </summary>
private string Get_yzm_DataSource(HttpContext context)
{
StringBuilder sb = new StringBuilder(); string path = context.Server.MapPath(@"~\yzmDataSource.txt"); using (Stream fs = new FileStream(path, FileMode.Open))
using (StreamReader read = new StreamReader(fs, Encoding.UTF8))
{
string len;
while ((len = read.ReadLine()) != null)
{
Regex rg = new Regex("[\\W\\s]+");
sb.Append(rg.Replace(len, ""));
}
} return sb.ToString();
} /// <summary>
/// 随机生成,指定个数的验证码内容
/// </summary>
/// <returns></returns>
private string CreateCode(HttpContext context, int length)
{
string str = Get_yzm_DataSource(context); Random ran = new Random(); string code = "";
for (int i = ; i < length; i++)
{
int sjIndex = ran.Next(, str.Length);
code += str[sjIndex];
} return code;
} public bool IsReusable
{
get
{
return false;
}
}
}
}

使用GDI技术创建ASP.NET验证码的更多相关文章

  1. MVC的验证(模型注解和非侵入式脚本的结合使用) .Net中初探Redis .net通过代码发送邮件 Log4net (Log for .net) 使用GDI技术创建ASP.NET验证码 Razor模板引擎 (RazorEngine) .Net程序员应该掌握的正则表达式

    MVC的验证(模型注解和非侵入式脚本的结合使用)   @HtmlHrlper方式创建的标签,会自动生成一些属性,其中一些属性就是关于验证 如图示例: 模型注解 通过模型注解后,MVC的验证,包括前台客 ...

  2. ASP.net 验证码(C#) MVC

    ASP.net 验证码(C#) MVC http://blog.163.com/xu_shuhao/blog/static/5257748720101022697309/ 网站添加验证码,主要为防止机 ...

  3. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](一)

    前言 大家好,我是Rector 从今天开始,Rector将为大家推出一个关于创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar]的文章系列, ...

  4. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](六)

    前言 大家好,我是Rector 又是星期五,很兴奋,很高兴,很high...啦啦啦... Rector在图享网又和大家见面啦!!!上一篇<一步一步创建ASP.NET MVC5程序[Reposit ...

  5. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](八)

    前言 Hi, 大家好,还是星期五,还是Rector,又在图享网准时和大家见面了. 今天给大家带来系列教程<一步一步创建ASP.NET MVC5程序[Repository+Autofac+Auto ...

  6. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](十)

    前言 朋友们, 大家好,我还是Rector,写ASP.NET MVC 5系列文章[一步一步创建ASP.NET MVC5程序Repository+Autofac+Automapper+SqlSugar] ...

  7. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](十一)

    前言 小伙伴们, 大家好,我是Rector. 最近Rector忙于换工作,没有太多时间来更新我们的ASP.NET MVC 5系列文章 [一步一步创建ASP.NET MVC5程序Repository+A ...

  8. 利用HTML5与jQuery技术创建一个简单的自动表单完成

    来源:GBin1.com 在线演示   在线下载 谷歌快速搜索自带大量自动完成插件——库中甚至还有一个附带的jQuery UI共享选项.然而今天我要寻找一个替代的解决方案.由DevBridge开发的j ...

  9. 使用面向对象技术创建高级 Web 应用程序

    作者: 出处: 使用面向对象技术创建高级 Web 应用程序 来源:开源中国社区 作者:oschina 最近,我面试了一位具有5年Web应用开发经验的软件开发人员.她有4年半的JavaScript编程经 ...

随机推荐

  1. springboot 接口返回数据时 net.sf.json.JSONNull["empty"]) 异常

    @ResetController返回数据时出现异常 Could not write JSON: Object is null; nested exception is com.fasterxml.ja ...

  2. Java - 冒泡排序的基础算法(尚学堂第七章数组)

    /** * 冒泡排序的基础算法 */ import java.util.Arrays; public class TestBubbleSort1 { public static void main(S ...

  3. 我的Python升级打怪之路【六】:面向对象(二)

    面向对象的一些相关知识点 一.isinstance(obj,cls) 检查实例obj是否是类cls的对象 class Foo(object): pass obj = Foo() isinstance( ...

  4. Orcale 之子查询

    子查询和连接查询一样,都提供了使用单个查询访问多个表中的数据的方法.子查询在其他查询的基础上,提供一种进一步有效的方式来访问数据. IN 关键字 使用 IN 关键字可以将原表中特定的的值与子查询中返回 ...

  5. 架构实战项目心得(六):后台服务nosql数据库mongodb

    一.架构介绍        mongodb有几种部署方式,这里采用的是副本集架构(Replica Set).        为了防止单点故障就需要引副本(Replication),当发生硬件故障或者其 ...

  6. 翻屏类 h5 适配方案:解决宽高自适应难题

    表格 图片等 宽度自适应  :width:100%;  box-sizing: border-box; 基于淘宝适配方案flexible + 翻屏h5 适配方案adaptive flexible解读及 ...

  7. 获取单个checkbox选中项

    1.获取单个checkbox选中项(三种写法)$("input:checkbox:checked").val()或者$("input:[type='checkbox']: ...

  8. Echarts 修改折线的颜色和折线的点的大小方法

    series: [{ type: 'line', smooth:true,//折点是圆弧状的                            showSymbol: true,          ...

  9. C#基础笔记 转自wojiushigelg

    笔记如下: 概念:.net与c# .net/dontnet:一般指.net framework框架,一种平台,一种技术 c#(charp):一种编程语言,可以开发基于.net的应用. *java既是一 ...

  10. asfda

    从事前端的朋友应该对"字体图标"这个词汇不陌生,为了适应越来越挑剔的屏幕,网页图标和简单图案使用.png来搭建已经基本上被淘汰了.取而代之的是使用css3和svg来绘制,而对于网页 ...