1  /  1  页   1 跳转 查看:1102

ASP.NET的3种验证码

ASP.NET的3种验证码

把最近碰到的 能够用的验证码 都放出来,作个记录
1.GSC_WebControlLibrary 这是在网上找到的一个控件,非常好用。但是效果不是特别好(见下图。
)虽然容易使用,所有的属性都可以像控件一样设置,但是可用性不太高。用户不能自定义,而且看起来这个验证码效果不太好。
效果:

2.用一个页面生成图片,另一个页面调用,验证码存入cookie,调用时取cookie对比验证.这个用户就可以按自己的喜好更改效果和验证码的长度了 (:

效果如图:


代码如下:
CheckCode.aspx


using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
public partial class Tools_CheckCode : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        this.CreateCheckCodeImage(GenerateCheckCode());
    }
    private string GenerateCheckCode()
    {
        int number;
        char code;
        string checkCode = String.Empty;
        System.Random random =new Random();
        for (int i =0; i <5; i++)
        {
            number = random.Next();
            if (number %2==0)
                code = (char)('0'+ (char)(number %10));
            else
                code = (char)('A'+ (char)(number %26));
            checkCode += code.ToString();
        }
        Response.Cookies.Add(new HttpCookie("CheckCode", checkCode));
        return checkCode;
    }
    private void CreateCheckCodeImage(string checkCode)
    {
        if (checkCode ==null|| checkCode.Trim() == String.Empty)
            return;
        System.Drawing.Bitmap image =new System.Drawing.Bitmap((int)Math.Ceiling((checkCode.Length *12.5)), 22);
        Graphics g = Graphics.FromImage(image);
        try
        {
            //生成随机生成器
            Random random =new Random();
            //清空图片背景色
            g.Clear(Color.White);
            //画图片的背景噪音线
for (int i =0; i <25; i++)
            {
                int x1 = random.Next(image.Width);
                int x2 = random.Next(image.Width);
                int y1 = random.Next(image.Height);
                int y2 = random.Next(image.Height);
                g.DrawLine(new Pen(Color.GreenYellow), x1, y1, x2, y2);
            }
            Font font =new System.Drawing.Font("Verdana", 12, (System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic));
            System.Drawing.Drawing2D.LinearGradientBrush brush =
new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, true);
            g.DrawString(checkCode, font, brush, 2, 2);
            //画图片的前景噪音点
        for (int i =0; i <80; i++)
            {
                int x = random.Next(image.Width);
                int y = random.Next(image.Height);
                image.SetPixel(x, y, Color.FromArgb(random.Next()));
            }
            //画图片的边框线
            g.DrawRectangle(new Pen(Color.Red), 0, 0, image.Width -1, image.Height -1);
            System.IO.MemoryStream ms =new System.IO.MemoryStream();
            image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
            Response.ClearContent();
            hc.Response.ContentType ="image/gif";
            Response.BinaryWrite(ms.ToArray());
        }
        finally
        {
            g.Dispose();
            image.Dispose();
        }
    }

}




然后在需要使用的页面引用:
UseCheckCode.aspx
<img src="Tools/CheckCode.aspx" alt="验证码" style="width: 60px; height: 24px"/>

3.用web handler生成图片。这个其实和前面的意思大致差不多,调用方法也基本和2一样,不同的是,他的验证码是存入Session的。供学习参考。

效果图如下:


ValidateImageHandler.ashx


<%@ WebHandler Language="C#" Class="ValidateImageHandler"%>

using System;
using System.Web;
using System.Web.SessionState;
using System.Drawing;
using System.Drawing.Imaging;
using System.Text;

/**////
<summary>
/// ValidateImageHandler 生成网站验证码功能
///
</summary>
public class ValidateImageHandler : IHttpHandler, IRequiresSessionState
{
    int intLength =5;              //长度
string strIdentify ="Identify"; //随机字串存储键值,以便存储到Session中
public ValidateImageHandler()
    {       
    }
    /**////
<summary>
    ///  生成验证图片核心代码
    ///
</summary>
    ///
<param name="hc"></param>
public  void ProcessRequest(HttpContext hc)
    {
        //设置输出流图片格式
        hc.Response.ContentType ="image/gif";
       
        Bitmap b =new Bitmap(200, 60);
        Graphics g = Graphics.FromImage(b);
        g.FillRectangle(new SolidBrush(Color.YellowGreen), 0, 0, 200, 60);
        Font font =new Font(FontFamily.GenericSerif, 48, FontStyle.Bold, GraphicsUnit.Pixel);
        Random r =new Random();
        //合法随机显示字符列表
string strLetters ="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
        StringBuilder s =new StringBuilder();
       
        //将随机生成的字符串绘制到图片上
for (int i =0; i < intLength; i++)
        {
            s.Append(strLetters.Substring(r.Next(0, strLetters.Length -1), 1));
            g.DrawString(s[s.Length -1].ToString(), font, new SolidBrush(Color.Blue), i *38, r.Next(0, 15));
        }
        //生成干扰线条
        Pen pen =new Pen(new SolidBrush(Color.Blue), 2);
        for (int i =0; i <10; i++)
        {
            g.DrawLine(pen, new Point(r.Next(0, 199), r.Next(0, 59)), new Point(r.Next(0, 199), r.Next(0, 59)));
        }
        b.Save(hc.Response.OutputStream, ImageFormat.Gif);
        hc.Session[strIdentify] = s.ToString(); //先保存在Session中,验证与用户输入是否一致
        hc.Response.End();
 
    }
   
    /**////
<summary>
    /// 表示此类实例是否可以被多个请求共用(重用可以提高性能)
    ///
</summary>
public
bool IsReusable
    {
        get
        {
            return true;
        }
    }
}


最后编辑学习 最后编辑于 2008-05-05 19:36:41
 

回复:ASP.NET的3种验证码

第三种怎么调用啊?????
 

回复:ASP.NET的3种验证码

调用方法和第二种相同啊,无非是把 src 属性改成自己的那个httphandler
 

回复:ASP.NET的3种验证码

第二中在.net2003不行么?
 

回复:ASP.NET的3种验证码

改天试试...呵呵..谢谢分享...
 

回复:ASP.NET的3种验证码



引用:
hc.Response.C;

hc.Response  后面的是C什么啊没联想出来
 

回复: ASP.NET的3种验证码



引用:
原帖由 aviosys 于 2008-4-24 17:45:00 发表
第二中在.net2003不行么?


第二种明显 都用到了 partial class

所以是asp.net2.0的,只能在vs2005 或者 2008中使用
http://www.Aspx1.Com
请帮忙宣传Aspx1 , Aspx1是ASP.NET学习者的家园 , 适宜长期居住.
 

回复: ASP.NET的3种验证码



引用:
原帖由 hekai 于 2008-4-30 14:12:00 发表


引用:
hc.Response.C;

hc.Response  后面的是C什么啊没联想出来


估计应该是 hc.Response.Clear ();
现在已经更正。
http://www.Aspx1.Com
请帮忙宣传Aspx1 , Aspx1是ASP.NET学习者的家园 , 适宜长期居住.
 

回复: ASP.NET的3种验证码



引用:
原帖由 aspx1 于 2008-5-3 8:18:00 发表


引用:
原帖由 hekai 于 2008-4-30 14:12:00 发表


引用:
hc.Response.C;

hc.Response  后面的是C什么啊没联想出来


估计应该是 hc.Response.Clear ();
现在已经更正。


是下面这个 我从作者那找的原始代码
//设置输出流图片格式
        hc.Response.ContentType =
"image/gif";


本帖被评分 1 次
 
1  /  1  页   1 跳转

版权所有 ASP.NET学习门户 2.0.1214   Sitemap  

返顶部