自己写的一个图形验证码页面(Asp.Net2.0通过)

asp.net|图形|验证码|页面

项目需要,要在首页登录界面添加一个图形验证码,赶时髦吧,网上一搜,特别多,找了几个,都不太满意。主要问题是大部分代码生成的图片宽度不唯一,页面布局不容易控制,其次是颜色单一,有些又过于抽象,不仔细看很容易弄错。针对特定的客户,我只需要“图片”长宽固定,颜色多样的数字图形验证码,借鉴网上的现有代码,自己操刀完成,以下是效果图:

原理不复杂,就是把网页当画布,运用各色画笔,在特定区域内画出数字,然后以特定格式(本例为PNG格式)发回客户端,在IE中显示为"图片",用于验证的字符串存于Session中。

主要代码如下:

//  生成随机数字字符串
public string GetRandomNumberString(int int_NumberLength)
{
    string str_Number = string.Empty;
    Random theRandomNumber = new Random();

    for (int int_index = 0; int_index < int_NumberLength; int_index++)
        str_Number += theRandomNumber.Next(10).ToString();

    return str_Number;
}

生成随机颜色

public Color GetRandomColor()
{
    Random RandomNum_First = new Random((int)DateTime.Now.Ticks);
    //  对于C#的随机数,没什么好说的
    System.Threading.Thread.Sleep(RandomNum_First.Next(50));
    Random RandomNum_Sencond = new Random((int)DateTime.Now.Ticks);      

    //  为了在白色背景上显示,尽量生成深色
    int int_Red = RandomNum_First.Next(256);
    int int_Green = RandomNum_Sencond.Next(256);
    int int_Blue = (int_Red + int_Green > 400) ? 0 : 400 - int_Red - int_Green;
    int_Blue = (int_Blue > 255) ? 255 : int_Blue;

    return Color.FromArgb(int_Red, int_Green, int_Blue);
}

根据验证字符串生成最终图象

public void CreateImage(string str_ValidateCode)
{
    int int_ImageWidth = str_ValidateCode.Length * 13;
    Random newRandom = new Random();
    //  图高20px
    Bitmap theBitmap = new Bitmap(int_ImageWidth, 20);
    Graphics theGraphics = Graphics.FromImage(theBitmap);
    //  白色背景
    theGraphics.Clear(Color.White);
    //  灰色边框
    theGraphics.DrawRectangle(new Pen(Color.LightGray, 1), 0, 0, int_ImageWidth - 1, 19);
   
    //  10pt的字体
    Font theFont = new Font("Arial", 10);

    for (int int_index = 0; int_index < str_ValidateCode.Length; int_index++)
    {           
        string str_char = str_ValidateCode.Substring(int_index, 1);
        Brush newBrush = new SolidBrush(GetRandomColor());
        Point thePos = new Point(int_index * 13 + 1 + newRandom.Next(3), 1 + newRandom.Next(3));
        theGraphics.DrawString(str_char, theFont, newBrush, thePos);
    }

    //  将生成的图片发回客户端
    MemoryStream ms = new MemoryStream();
    theBitmap.Save(ms, ImageFormat.Png);

    Response.ClearContent(); //需要输出图象信息 要修改HTTP头
    Response.ContentType = "image/Png";
    Response.BinaryWrite(ms.ToArray());
    theGraphics.Dispose();
    theBitmap.Dispose();
    Response.End();
}

最后在Page_Load中调用以上代码

private void Page_Load(object sender, System.EventArgs e)
{     
    if(!IsPostBack)
    {
        //  4位数字的验证码
        string str_ValidateCode = GetRandomNumberString(4);
        //  用于验证的Session
        Session["ValidateCode"] = str_ValidateCode;
        CreateImage(str_ValidateCode);
    }
}

使用的时候在页面中加入一个Image,将图片路径改为ValidateCode.aspx的相对路径即可

<img src="ValidateCode.aspx" />在需要验证的地方填入如下代码:
if (TextBox1.Text == Session["ValidateCode"].ToString())
{
    TextBox1.Text = "正确!";
}
else
    TextBox1.Text = "错误!";

  OK,基本搞定,总结一下:

  优点:

  1. 简单明了,适于简单运用
  2. 界面友好,图片长宽格式固定

  缺点:

  1. 如果有多个页面都需要此验证码,则会导致Session被其它页面重写的情况,可以考虑指定具体Session值为效验值

  2. 暂时只支持数字,不过更改GetRandomNumberString()中的代码可以实现指定字符机的随机字符串

  3. 页面刷新后验证码随之改变

  抛砖引玉,欢迎各位博友评点

时间: 2024-08-31 03:03:43

自己写的一个图形验证码页面(Asp.Net2.0通过)的相关文章

使用Asp.Net 2.0编写的图形验证码页面

项目需要,要在首页登录界面添加一个图形验证码,赶时髦吧,网上一搜, 特别多,找了几个,都不太满意.主要问题是大部分代码生成的图片宽度不唯一 ,页面布局不容易控制,其次是颜色单一,有些又过于抽象,不仔细看很容易弄 错.针对特定的客户,我只需要"图片"长宽固定,颜色多样的数字图形验证码 ,借鉴网上的现有代码,自己操刀完成,以下是效果图: 原理不复杂,就是把网页当画布,运用各色画笔,在特定区域内画出数字, 然后以特定格式(本例为PNG格式)发回客户端,在IE中显示为"图片"

一年了,用ASP.NET2.0就没有发送成功一个邮件,我的天!

问题描述 我的代码:if(TextBox1.Text.IndexOf("@")>-1)//判断收信地址集是否有效{MailMessagemm=newMailMessage();mm.To.Add(newMailAddress(TextBox1.Text));mm.From=newMailAddress(TextBox2.Text);mm.Subject=TextBox5.Text;mm.Body=TextBox6.Text;mm.SubjectEncoding=System.Te

ASP.NET2.0:页面中链入的CSS、js文件带中文时需注意_实用技巧

当定义的样式中有中文时,如 .sometyle {font-family:@黑体;},如果书写不正确,如写成 .sometyle {font-family: 黑体;},这应该是个错误的写法,这样不仅这个样式不起作用,而且还会影响到定义在它后面的样式起作用,不知道对css的解析本来就是这个规则,还是ASP.NET 2.0的问题. 当你直接把从网上download下来的js文件加入的VS2005项目中时,如果此文件中带中文,当你调用其方法时,就会出现对象找不到的js错误,就像你没有链如该文件一样.你

在ASP.NET2.0里打印网页指定的内容(比如打印网页里的一个Table)

原文:在ASP.NET2.0里打印网页指定的内容(比如打印网页里的一个Table)打印指定内容: <html> <head> <script   type= "text/javascript "   language= "javascript "> function   printPage()   {   var   newWin   =   window.open( 'about:blank ', ' ', ' ');   va

asp.net2.0奇怪问题,在公网访问,页面会间歇性下载不完整,即时不时客户端页面只下载到一部分就没反应空白了?

问题描述 asp.net2.0奇怪问题,在公网访问,页面会间歇性下载不完整,即时不时客户端页面只下载到一部分就没反应空白了?这是不是与iis有关还是asp.net的设置有关?不知道大家有没有遇到? 解决方案 解决方案二:顶一下

ASP.NET2.0:Ilungasoft.Framework.Web之基于Callback的无刷新上传进度条控件[带源码]

asp.net|web|控件|上传|刷新|无刷新 共享一个基于Callback的无刷新上传进度条控件的源码.本控件使用的HttpMoudule基于宝玉的一个上传进度条的sample,这里封装为一个控件,方便使用.无需任何代码,只需设置web.config,添加HttpModule的引用,再将控件拖到页面就行.页面中的文件保存操作和传统的asp.net文件上传完全一样.可以设置属性上传过程中出错或上传成功时跳转到其它页面.兼容IE,Firefox,Opera.其它环境没测试,不过因为是基于Asp.

ASP.NET2.0 WebRource,开发微调按钮控件

asp.net|web|按钮|控件 现在.有许多开发人员已经在使用ASP.NET2.0的WebResource的功能了.WebResource允许我们嵌入资源到程序集中.包括图像,文本等. 在介绍WebResource就不得不介绍一下WebResource.axd,我们来看一下 script language="javascript"     src="WebResource.axd?a=s&r=WebUIValidation.js&t=63194436284

ASP.NET2.0的控件状态和视图状态探讨

asp.net|控件|视图 基本概念 控件状态-为了让控件正常工作,有时需要存储控件状态数据.例如,如果编写了一个自定义控件,其中具有显示不同信息的不同选项卡,为使该控件如预期一样工作,控件需要知道在往返过程中选择的是哪个选项卡.ViewState 属性可用于此目的,但开发人员可能在页级别关闭了视图状态,从而有效地中断控件.为解决此问题,ASP.NET 页框架在 ASP.NET 2.0 版中公开了一种称为控件状态的新功能. ControlState 属性允许保持特定于控件的属性信息,不像 Vie

ASP.NET2.0数据操作之母板页和站点导航

asp.net|导航|数据|站点 导言 通常,用户友好的个性化站点都有着一致的,站点统一的页面布局和导航体系.Asp.net 2.0引入的两个新特性给我们在统一站点的页面布局和站点导航上提供了简单而有效的工具,它们是母板页和站点导航.母板页允许开发者创建统一的站点模板和指定的可编辑区域.这样,aspx页面只需要给模板页中指定的可编辑区域提供填充内容就可以了,所有在母板页中定义的其他标记将出现在所有使用了该母板页的aspx页面中.这种模式允许开发者可以统一的管理和定义站点的页面布局,因此可以容易的