使用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编程经 ...
随机推荐
- 20164324王启元 Exp1 PC平台逆向破解
一.逆向及Bof基础实践说明 1.1实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 手工修 ...
- linux下定时任务的工具crontab的用法
Linux计划任务工具cron用法详解 linux下大名鼎鼎的计划任务工具crontab的使用介绍baidu.google上多得让人眼花缭乱,本着“天下文章一大抄”的觉悟,加上本人日常工作中总结的使用 ...
- java实现HTTP请求的三种方式
目前JAVA实现HTTP请求的方法用的最多的有两种:一种是通过HTTPClient这种第三方的开源框架去实现.HTTPClient对HTTP的封装性比较不错,通过它基本上能够满足我们大部分的需求,Ht ...
- ambari-server启动出现ERROR main] DBAccessorImpl:106 - Error while creating database accessor java.lang.ClassNotFoundException:com.mysql.jdbc.Driver问题解决办法(图文详解)
不多说,直接上干货! 问题详情 ambari-server启动时,报如下的错误 问题分析 注:启动ambari访问前,请确保mysql驱动已经放置在/usr/share/Java内且名字是mysql- ...
- xamarin for android 环境配置
先安装vs2010,参考以下教程可以进行破解 http://hi.baidu.com/hegel_su/item/2b0771c6aaa439e496445252?qq-pf-to=pcqq.grou ...
- Java入门系列-25-NIO(实现非阻塞网络通信)
还记得之前介绍NIO时对比传统IO的一大特点吗?就是NIO是非阻塞式的,这篇文章带大家来看一下非阻塞的网络操作. 补充:以数组的形式使用缓冲区 package testnio; import java ...
- 深入理解JavaScript系列(49):Function模式(上篇)
介绍 本篇主要是介绍Function方面使用的一些技巧(上篇),利用Function特性可以编写出很多非常有意思的代码,本篇主要包括:回调模式.配置对象.返回函数.分布程序.柯里化(Currying) ...
- linux压缩和解压缩命令大全[转]
.tar 解包:tar zxvf FileName.tar 打包:tar czvf FileName.tar DirName ------------------------------------- ...
- 使用Electron开发桌面应用
Electron 框架的前身是 Atom Shell,可以让你写使用 JavaScript,HTML 和 CSS 构建跨平台的桌面应用程序.它是基于io.js 和 Chromium 开源项目,并用于在 ...
- ajax提交手机号去数据库验证并返回状态值
<script type="text/javascript"> $(function(){ $('.agree_regi').click(function(){ var ...