RSS
热门关键字:  ASP.NET  ASP  html  ASP.NET文件  ASP NET 漫

ASP.NET验证码技术(C#)

来源: 作者: 时间:2008-07-03 点击:

ASP.NET中使用验证码技术

    由于验证码技术中服务器程序需要创建验证码图片,里面用到了图形编程,因此本节课程仍然是C#发现之旅的图形编程系列教程。

    根据验证码的原理,我们使用C#ASP.NET中实现了验证码的功能。

checkimage.aspx

    首先根据上节课程的内容,我们要创建一个图片服务页面,专门用于提供包含验证码文本的图片,为此我们建立一个 checkimage.aspx 的页面。其HTML代码很简单,只有一行,不输出任何内容。在其Page_Load方法中就有创建验证码图片的过程。


// 创建一个包含随机内容的验证码文本
System.Random rand = new Random();
int len = rand.Next(4 , 6 );
char[] chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
System.Text.StringBuilder myStr = new System.Text.StringBuilder();
for( int iCount = 0 ; iCount < len ; iCount ++ )
{
    myStr.Append( chars[ rand.Next( chars.Length )]);
}
string text = myStr.ToString();
// 保存验证码到 session 中以便其他模块使用
this.Session["checkcode"] = text ;
Size ImageSize = Size.Empty ;
Font myFont = new Font("MS Sans Serif" , 20 );
// 计算验证码图片大小
using( Bitmap bmp = new Bitmap( 10 , 10 ))
{
    using( Graphics g = Graphics.FromImage( bmp ))
    {
        SizeF size = g.MeasureString( text , myFont , 10000 );
        ImageSize.Width = ( int ) size.Width + 8 ;
        ImageSize.Height = ( int ) size.Height + 8 ;
    }
}
// 创建验证码图片
using( Bitmap bmp = new Bitmap( ImageSize.Width , ImageSize.Height ))
{
    // 绘制验证码文本
    using( Graphics g = Graphics.FromImage( bmp ))
    {
        g.Clear( Color.White );
        using( StringFormat f = new StringFormat())
        {
            f.Alignment = StringAlignment.Near ;
            f.LineAlignment = StringAlignment.Center ;
            f.FormatFlags = StringFormatFlags.NoWrap ;
            g.DrawString(
                text ,
                myFont ,
                Brushes.Black ,
                new RectangleF(
                0 ,
                0 ,
                ImageSize.Width ,
                ImageSize.Height ),
                f );
        }//using
    }//using
    // 制造噪声 杂点面积占图片面积的 30%
    int num = ImageSize.Width * ImageSize.Height * 30 / 100 ;
    for( int iCount = 0 ; iCount < num ; iCount ++ )
    {
        // 在随机的位置使用随机的颜色设置图片的像素
        int x = rand.Next( ImageSize.Width );
        int y = rand.Next( ImageSize.Height );
        int r = rand.Next( 255 );
        int g = rand.Next( 255 );
        int b = rand.Next( 255 );
        Color c = Color.FromArgb( r , g , b );
        bmp.SetPixel( x , y , c );
    }//for
    // 输出图片
    System.IO.MemoryStream ms = new System.IO.MemoryStream();
    bmp.Save( ms , System.Drawing.Imaging.ImageFormat.Png );
    this.Response.ContentType = "image/png";
    ms.WriteTo( this.Response.OutputStream );
    ms.Close();
}//using
myFont.Dispose();

    首先我们使用.NET框架中随机数生成器 Random类型来生成一个不定长的包含随机数字和英文字符的文本,这就是验证码原始文本,我们将其保存在session中供以后使用。

    然后我们创建一个临时图片,并据此创建一个临时的图象绘制对象,然后调用GraphicsMeasureString函数获得这个字符串的显示大小。据此我们就可以计算出验证码图片的大小。

    然后我们创建一个位图对象,在此基础上创建一个图形绘制对象,然后调用图形绘制对象的DrawString函数将验证码文本绘制在这个位图上。

    绘制验证码后我们在图片上随机的制造杂点来混淆图片内容。这些杂点的面积占图片面积的30%,而且其位置和颜色都是随机的。这些杂点能严重的干扰程序辨认验证码文本。但人脑在辨认文本时能比较轻松的排除这些干扰。

    图片生成后页面就使用PNG格式将图片文档发送到客户端。

checkimage.aspx还提供了一个静态函数来检测验证码。

/// <summary>
/// 检查指定的文本是否匹配验证码
/// </summary>
/// <param name="text">要判断的文本</param>
/// <returns>是否匹配</returns>
public static bool CheckCode( string text )
{
    string txt = System.Web.HttpContext.Current.Session["checkcode"] as string ;
    return text == txt ;
}

    代码很简单。就是看看参数传进的文本是否等于 session 中保存的验证码文本。其他的页面程序调用这个函数就可以判断验证码的正确性。

TAG :asp.net  
上一篇:ASP.NET 2.0的URL映射的实现方法
下一篇:没有了
相关文章

ASP.NET验证码技术(C#)

ASP.NET 2.0的URL映射的实现方法

ASP.NET中实现Url Rewriting

ASP.NET 2.0防止同一用户同时登陆

ASP.NET 2.0防止同一用户同时登陆

ASP.NET生成静态页面和分页代码

基于ASP.NET MVC框架编程之视图渲

ASP.NET部署三层架构

ASP.NET2.0中实现主页嵌套

Asp.net实现简单的文字水印

最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册
栏目列表