使用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编程经 ...
随机推荐
- ajax中的异步机制导致的问题
设置async:false;即可将请求设置为同步的,所以,我们就可以实现:在ajax请求之后再执行下面的语句.
- MVC目录规范
入口程序 单一入口机制,单一入口指在一个web应用程序中,所有的请求都是指向一个脚本文件,例如我们经常看到某一个网站所有的页面都是index.php??xxxx这样的形式.所有对使用程序的访问都是必须 ...
- Flyway-使用步骤
1.创建一个Maven项目 2.编辑当下的pom.xml,添加flyway依赖和Mysql依赖 <project ...> ... <dependencies> <d ...
- PHP常用文件操作
<?php $path = "/home/work/srccode/hello.go"; $dirName = dirname($path); $name = basenam ...
- Android和kernel杂散点集合
Android: 1.编译 普通的编译: 1). source build/envsetup.sh 2).lunch 3).make -jx make kernel:只重新编译kernel部分镜像,但 ...
- 架构实战项目心得(八):dubbo知识的整理
1 Dubbo启动时检查.集群容错.负载均衡.线程模型的设置以及选项: 启动时检查:(1)Dubbo默认会在启动的时候检查依赖的服务是否可用,不可用时会抛出异常.阻止Spring初始化完成.以便 ...
- 判断网站域名是否被GFW(墙)过滤屏蔽了
GFW:Greate Firewall Of China中国防火长城: 描述: 1.今天所属的一个域名被告诉不能访问了,赶紧自己测试了一下,发现可以,然后对方试了下说是不行,然后仔细按对方说的一步步操 ...
- Bitbucket 关联 VS
1.双击已经建立好的仓库 - 克隆仓库-目标路径选择一个空的文件夹,点击克隆 2.把已经建立好的项目拷贝的到刚刚那个空目录里面 3.在VS里面打开新路径下面的项目,点击提交即可; 我安装了Bitbuc ...
- Java复习第三天
Day06 1.二维数组定义格式? (1)元素是一维数组的数组. (2)格式: A:数据类型[][] 数组名 = new 数据类型[m][n]; B:数据类型[][] 数组名 = new 数据类型[m ...
- PS基础,英语
PS基础(矢量图案的绘制) 水平参考线:新建背景(长宽一致,背景内容为透明)---设置水平参考线(水平垂直都要)---完成. 背景制作:设置前景色---用矩形选框工具绘制正方形选区(背景已被参考线平分 ...