实现Web验证码图片-原理

时间:2021-11-04 03:28:02

实现验证码的基础

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)

实现Web验证码图片-原理
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;
        }
    }
}
实现Web验证码图片-原理

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

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

补充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验证码图片-原理的更多相关文章

  1. Web验证码图片的生成-基于Java的实现

    验证码图片是由程序动态产生的,每次访问的内容都是随机的.那么如何采用程序动态产生图片,并能够显示在客户端页面中呢?原理很简单,对于java而言,我们首先开发一个Servlet,这个Servlet的任务 ...

  2. Atitit&period;获取验证码图片通过web

    Atitit.获取验证码图片通过web 1. WebRequest进行较为底层的访问(不推荐) 1 2. WebBrowser截图 1 3. 剪贴板复制法Clipboard(推荐) 1 4. C# 取 ...

  3. java web学习总结&lpar;九&rpar; -------------------通过Servlet生成验证码图片

    一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下:

  4. java web 学习九(通过servlet生成验证码图片)

    一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下:

  5. java web,生成验证码图片的技术

    偶然知道原来有些网站的验证码图片都是随机生成的,后来听人讲了一下,就做了这个小例子 生成图片,绘制背景,数字,干扰线用到了java.awt包,主要使用BufferedImage来生成图片,然后使用Gr ...

  6. Java Web学习总结(6)——通过Servlet生成验证码图片

    一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下: 创建一个DrawImage Servlet,用来生成验证码图片 package gacl.res ...

  7. Linux 部署java web 项目,验证码图片不显示文字问题

    系统上线后,在获取验证码接口时,获取的验证码图片上没有对应的验证码数字,经过验证后,是由于Linux缺少字体造成的. 正常我们也可以将window的字体直接上传到linux服务器上,window的字体 ...

  8. Ajax动态刷新验证码图片

    一> 原理: 把用代码生成的图片存放到硬盘当中,然后在返回存储路径把图片通过图片标签的 src 属性 自动加载到浏览器中 二> 步骤 1. 首先用GDI+ 绘图 把验证码图片给绘制出来 2 ...

  9. delphi WebBrowser控件上网页验证码图片识别教程&lpar;一&rpar;

    步骤一:获取网页中验证码图片的url地址 在delphi中加入一个BitBtn和一个memo以及WebBrowser控件实现网页中验证码图片的url地址的获取 程序如下:procedure TForm ...

随机推荐

  1. Principles of measurement of sound intensity

    Introduction In accordance with the definition of instantaneous sound intensity as the product of th ...

  2. c&num; winform DataGridView单击选中一整行,只能单选,不能选择多行,只能选择一行

    设置DataGridView的属性SelectionMode为FullRowSelect 这样就使DataGridView不是选择一个字段,而是选择一整行了 设置DataGridView的属性Mult ...

  3. 正式工作的前奏——一个Java程序员的实习总结(1)

    不知不觉,到深圳实习已经三个礼拜了.跟在暑假的三个半月实习不一样,这次收获更多,感受更好,算是摆脱了那次实习给我带来的阴影(这个会放到以后才说). 在知乎上,有这么一个问题,你现在最想跟刚工作时的你说 ...

  4. JVM内存结构、垃圾回收那点事

    翻看电脑的文件夹,无意看到了9月份在公司做的一次分享,浏览了一下"婆婆特",发现自己在ppt上的写的引导性问题自己也不能确切的回答出来,哎,知识这东西,平时不常用的没些日子就生疏了 ...

  5. 一些值得学习和借鉴的&period;Net 开源项目

    1.DotNetFramework .NET Reference Source 发布了 beta 版,可以在线浏览 .NET Framework 4.5.1 的源代码,并且可以通过配置,在 Visua ...

  6. &lbrack;CareerCup&rsqb; 11&period;3 Search in Rotated Sorted Array 在旋转有序矩阵中搜索

    11.3 Given a sorted array of n integers that has been rotated an unknown number of times, write code ...

  7. EMVTag系列6《IAC 发卡行行为代码》

    R(需求):数据应存在,在读应用数据过程中,终端不检查:将变成必备 L: 5 IAC 的值,最好不要自定义,最好和所选的模板完全匹配.如果修改持卡人认证位,PIN Bypass 相关的位.如果有业务需 ...

  8. Android--简单的三级菜单

      关于这个菜单应该在很多播放器应用里面可以看见,直接先上两张效果图吧,一张是该Demo的效果图,一张是优酷手机客户端的效果图.                                     ...

  9. chmod -R o&plus;rX &sol;data

    When using  chmod -R o+rx /data , you set the execute permission on all directories as well as files ...

  10. IntelliJ IDEA2018&period;1、2017&period;3破解教程

    (1)下载破解补丁 把下载的破解补丁放在你的idea的安装目录下的bin的目录下面(如下图所示),本文示例为G:\idea\IntelliJ IDEA 2017.3.4 破解补丁下载:http://i ...