实现Web验证码图片-原理
实现验证码的基础
GDI+ graphics device interface plus的缩写,即图形设备接口。GDI+为开发者提供了一组实现与各种设备(具有图形化能力但不涉及图形细节的设备)进行交互的库函数。C#通过Bitmap类创建位图对象、Grephics类创建画板对象,再通过Pen类、Brush类、Color类等画位图:
Point结构 在二维平面中 定义点坐标的有序对。常用于定义 窗体或控件位置、其他图形(线条/矩形等)边界。
创建:Point p = new Point(30,90);
IsEmpty属性检测Point结构是否为空。
Size结构 存储有序整数对。常用于定义 窗体、空间呵其他矩形区域的大小。
第一个构造函数接受一个Point结构: Point p = new Point(30,90);
Size s = new Size(p);
第二个构造函数接受二个int值:Size s = new Size(30,90);
主要属性:Whdtn、hight、isEmpty
Rectangle结构 存储四个整数(表矩形位置和大小)。由一个定义左上角的Point结构 和 一个定义大小的Size结构 组成。
主要属性:Location 左上角坐标、Size 矩形大小、Height/Width 矩形高宽、Left/Right 左右边x坐标、Top/Bottom 上下边y坐标、isEmpty
实现验证码主要语法:
//位图对象 Bitmap bmp = new Bitmap(120,32);
//画板对象 Graphics gp = Graphics.FromImage(bmp);
//画板背景色 gp.Clear(Color.Silver); 默认为black
//起点对象 Point p1 = new Point(0, 4);
//画笔对象 Pen p = new Pen(Color.Red);
//画刷颜色 Brush s = Brushes.Red;
//文字对象 string code = "";
//文字保存到会话中 Session["checkcode"] = code;
//画板绘制文字 gp.DrawString(code, new Font("楷体", 14), s, p1);(内容,字体,颜色,起点坐标)
//位图输出到页面 bmp.Save(Response.OutputStream, ImageFormat.Gif);
开始验证码的实现:
一、创建一个一般应用程序(yzm.ashx)

using System.Drawing; (此命名空间给GDI+提供基本图形处理功能的访问。)
using System.Drawing.Imaging;
public class YZM : IHttpHandler,System.Web.SessionState.IRequiresSessionState {
public void ProcessRequest (HttpContext context) {
context.Response.ContentType = "text/JPEG";///将返回类型设置为JPEG格式
Bitmap bitmap = new Bitmap(100,50);//创建一个Image位图对象。
Graphics g = Graphics.FromImage(bitmap);//从指定的Image位图创建一个Graphics对象
Random rand = new Random();//创建一个随机数变量
int code=rand.Next(1000,9999);//利用Next()返回在1000到9999之间的飞非负随机数。
string strCode = code.ToString();//将随机数转换为string类型。
HttpContext.Current.Session["Code"] = strCode;//必须实现System.Web.SessionState.IRequestSessionState接口后才能在ashx中读写Session!!!
g.DrawString(strCode,new Font("黑体",16),Brushes.Silver,new Point(5,15));//绘制位图!<graphicsVar>.DrawString(随机数,字体,随机数颜色,随机数坐标)
//接下来用for循环为验证码位图添加随机直线
for (int i = 0; i < 10; i++)
{
int x1 = rand.Next(bitmap.Width);//<randomVar>.Next(int maxValue)指定随机数最大值
int y1 = rand.Next(bitmap.Height);
int x2 = rand.Next(bitmap.Width);
int y2 = rand.Next(bitmap.Height);
g.DrawLine(new Pen(Color.Red), x1, y1, x2, y2);
/*可用类似方式定义下列属性: <graphicsVar>.DrawLine() 画随机直线
<graphicsVar>.SetPixsl() 画随机噪音点
*/
}
g.DrawRectangle(new Pen(Color.Silver), 1, 1, bitmap.Width - 3, bitmap.Height - 3);//给验证码位图绘画矩形边框 |
虚线框中的代码不是必须的,只是对位图的进一步绘画。
bitmap.Save(context.Response.OutputStream,ImageFormat.Jpeg);//用将位图添加到输出流、
}
public bool IsReusable {
get {
return false;
}
}
}

二、创建一个验证页面,调试!

protected void 提交验证码按钮_Click(object sender, EventArgs e)
{
//先从Session中读取正确的验证码,再验证用户输入的值 string 正确的验证码 = Convert.ToString(Session["Code"]);
if (TextBox1.Text == 正确的验证码) { Label1.Text = "验证成功"; } else { Label1.Text = "输入的验证码有误"; }

补充1:
如何实现点击图片刷新验证码?可添加onclick事件重新加载图片源:src=“ ”
<img src="YZM.ashx" onclick="this.src='YZM.ashx?a='+new Date()" />
注:添加onclick="this.src='YZM.ashx'" 图片是不会刷新,需不同的URL地址。
可以添加onclick="this.src='YZM.ashx?a=aaa'" 但图片只会刷新一次。
所以需不同的可动态改变的URL地址。可在后面加上当前时间:+new Data()
实现Web验证码图片-原理的更多相关文章
- Web验证码图片的生成-基于Java的实现
验证码图片是由程序动态产生的,每次访问的内容都是随机的.那么如何采用程序动态产生图片,并能够显示在客户端页面中呢?原理很简单,对于java而言,我们首先开发一个Servlet,这个Servlet的任务 ...
- Atitit.获取验证码图片通过web
Atitit.获取验证码图片通过web 1. WebRequest进行较为底层的访问(不推荐) 1 2. WebBrowser截图 1 3. 剪贴板复制法Clipboard(推荐) 1 4. C# 取 ...
- java web学习总结(九) -------------------通过Servlet生成验证码图片
一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下:
- java web 学习九(通过servlet生成验证码图片)
一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下:
- java web,生成验证码图片的技术
偶然知道原来有些网站的验证码图片都是随机生成的,后来听人讲了一下,就做了这个小例子 生成图片,绘制背景,数字,干扰线用到了java.awt包,主要使用BufferedImage来生成图片,然后使用Gr ...
- Java Web学习总结(6)——通过Servlet生成验证码图片
一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下: 创建一个DrawImage Servlet,用来生成验证码图片 package gacl.res ...
- Linux 部署java web 项目,验证码图片不显示文字问题
系统上线后,在获取验证码接口时,获取的验证码图片上没有对应的验证码数字,经过验证后,是由于Linux缺少字体造成的. 正常我们也可以将window的字体直接上传到linux服务器上,window的字体 ...
- Ajax动态刷新验证码图片
一> 原理: 把用代码生成的图片存放到硬盘当中,然后在返回存储路径把图片通过图片标签的 src 属性 自动加载到浏览器中 二> 步骤 1. 首先用GDI+ 绘图 把验证码图片给绘制出来 2 ...
- delphi WebBrowser控件上网页验证码图片识别教程(一)
步骤一:获取网页中验证码图片的url地址 在delphi中加入一个BitBtn和一个memo以及WebBrowser控件实现网页中验证码图片的url地址的获取 程序如下:procedure TForm ...
随机推荐
- Effective C++ -----条款27:尽量少做转型动作
如果可以,尽量避免转型,特别是在注重效率的代码中避免dynamic_casts.如果有个设计需要转型动作,试着发展无需转型的替代设计. 如果转型是必要的,试着将它隐藏于某个函数背后.客户随后可以调用该 ...
- malloc原理和内存碎片
当一个进程发生缺页中断的时候,进程会陷入内核态,执行以下操作: 1.检查要访问的虚拟地址是否合法 2.查找/分配一个物理页 3.填充物理页内容(读取磁盘,或者直接置0,或者啥也不干) 4.建立映射关系 ...
- jboss服务器修改端口说明
如果一台机器安装多个jboss服务器,就需要修改服务器的端口号,否则各个服务器之间会有冲突.目前确认需要修改的配置如下一.vi $JBOSS_HOME/server/default/conf/jbos ...
- 生成Geometry
// 由一组点集生成一张三角面片网格Geometry osg::Geometry* createTRIANGLESGeometry(MyMesh &mesh) { osg::ref_ptr&l ...
- C++静态代码分析PreFast
1历史 Prefast是微软研究院提出的静态代码分析工具.主要目的是通过分析代码的数据和控制信息来检测程序中的缺陷.需要强调的是,Prefast检测的缺项不仅仅是安全缺陷,但是安全缺陷类型是其检测的最 ...
- 让div等块级元素水平以及垂直居中的解决办法
一.背景 我们在设计页面的时候,经常要把div等块级元素居中显示,而且是相对页面窗口水平和垂直方向居中显示,如让登录窗口居中显示.我们传统解决的办法是用纯CSS来让div等块级元素居中.在本文中,我将 ...
- 阿里云CentOS配置全过程
1. 安装基本依赖包 yum install gcc gcc-c++ autoconf automake 2. 升级所有 yum update 3.安装mongodb 1. 配置mongodb- ...
- iOS小技巧总结,绝对有你想要的
原文链接 在这里总结一些iOS开发中的小技巧,能大大方便我们的开发,持续更新. UITableView的Group样式下顶部空白处理 //分组列表头部空白处理 UIView *view = [[UIV ...
- Volley学习总结
本文主要包括以下内容 volly基本操作(String与Json类型) volly图片操作 自定义volly volly源码分析 Volley简单易用,在性能方面也进行了大幅度的调整,它的设计目标就是 ...
- mysql入门语句10条
1,连接数据库服务器 mysql -h host -u root -p xxx(密码) 2,查看所有库 show databases; 3,选库 use 库名 4,查看库下面的表 show ...