使用GDI技术创建ASP.NET验证码
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验证码的更多相关文章
- MVC的验证(模型注解和非侵入式脚本的结合使用) .Net中初探Redis .net通过代码发送邮件 Log4net (Log for .net) 使用GDI技术创建ASP.NET验证码 Razor模板引擎 (RazorEngine) .Net程序员应该掌握的正则表达式
MVC的验证(模型注解和非侵入式脚本的结合使用) @HtmlHrlper方式创建的标签,会自动生成一些属性,其中一些属性就是关于验证 如图示例: 模型注解 通过模型注解后,MVC的验证,包括前台客 ...
- ASP.net 验证码(C#) MVC
ASP.net 验证码(C#) MVC http://blog.163.com/xu_shuhao/blog/static/5257748720101022697309/ 网站添加验证码,主要为防止机 ...
- 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](一)
前言 大家好,我是Rector 从今天开始,Rector将为大家推出一个关于创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar]的文章系列, ...
- 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](六)
前言 大家好,我是Rector 又是星期五,很兴奋,很高兴,很high...啦啦啦... Rector在图享网又和大家见面啦!!!上一篇<一步一步创建ASP.NET MVC5程序[Reposit ...
- 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](八)
前言 Hi, 大家好,还是星期五,还是Rector,又在图享网准时和大家见面了. 今天给大家带来系列教程<一步一步创建ASP.NET MVC5程序[Repository+Autofac+Auto ...
- 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](十)
前言 朋友们, 大家好,我还是Rector,写ASP.NET MVC 5系列文章[一步一步创建ASP.NET MVC5程序Repository+Autofac+Automapper+SqlSugar] ...
- 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](十一)
前言 小伙伴们, 大家好,我是Rector. 最近Rector忙于换工作,没有太多时间来更新我们的ASP.NET MVC 5系列文章 [一步一步创建ASP.NET MVC5程序Repository+A ...
- 利用HTML5与jQuery技术创建一个简单的自动表单完成
来源:GBin1.com 在线演示 在线下载 谷歌快速搜索自带大量自动完成插件——库中甚至还有一个附带的jQuery UI共享选项.然而今天我要寻找一个替代的解决方案.由DevBridge开发的j ...
- 使用面向对象技术创建高级 Web 应用程序
作者: 出处: 使用面向对象技术创建高级 Web 应用程序 来源:开源中国社区 作者:oschina 最近,我面试了一位具有5年Web应用开发经验的软件开发人员.她有4年半的JavaScript编程经 ...
随机推荐
- vscode用yuml画类图
vscode用yuml画类图 最近在找画类图的工具,发现vscode一款插件很好用,还支持markdown.vscode插件中直接搜索yuml安装即可. 文件后缀.yuml. 文件开头第一行这样写// ...
- nginx, flask, wsgi
原来自己还没搞懂这些. 首先post一个观点: nginx应该是没解析任何东西,就判断是不是http请求,然后转发?或者判断是不是tcp请求,然后转发. 所以给了python后台就可以用wsgi解包. ...
- db2 monitor event
1.创建事件监控器至少需要哪些权限? DBADM authority SQLADM authority 2.事件监控器的种类有哪些? 3. db2 flush event monitor eventm ...
- AngularJs学习笔记--Injecting Services Into Controllers
原版地址:http://docs.angularjs.org/guide/dev_guide.services.injecting_controllers 把service当作被依赖的资源加载到con ...
- 常见Http协议响应码
总体总结: 1XX:信息相应类,表示接受到请求并且继续处理 2XX:处理成功响应类,表示动作被成功的接收.理解和接受 3XX:重定向响应类,为了完成指定的动作,必须完成进一步处理和操作 4XX:客户端 ...
- 【Css】Layout布局(二)
css定位(Positioning) 所谓定位,即允许你定义元素框相对于其正常位置应该出现的位置,或者相对于父元素.另一个元素甚至浏览器窗口本身的位置. css提供了三种基本的定位机制:普通流.浮动和 ...
- 转 Unity企业级支持案例与分析
Unity大中华区技术支持总监张黎明以“Unity企业级支持案例与分析”为主题进行了分享. 以下为演讲实录: 张黎明:非常感谢大家来参加今年的Unite,其实我现在看到有的朋友已经不是第一次来参加Un ...
- hadoop源码svn下载地址
1.apache开源框架
- 2.1 js 基础--select深入
select 获取select下的所有option 用op=select.options option属性:op[1].value,op[1].text; // ...
- input输入提示历史记录
一般便于用户的输入习惯,我们都会提示历史消息,让用户有更好的使用体验,以前可能比较多朋友会用js来实现,现在HTML5的datalist可以轻松帮我们实现这个功能!只需以下几行代码 <!doct ...