∑△宇↑▲

办公楼里办公间,办公间里程序员。程序人员做程序,又拿程序换酒钱。清醒只在屏前坐,酒醉还来屏下眠。半醒半醉日复日,花开花落年复年。试问街上多美女,哪个归得程序员!

导航

asp.net验证码生成和刷新及验证

验证码技术是为了防止暴力破解等而设定的。现在一般的网站注册等都提供验证码功能,特别是腾讯更是长长的一串。文中参考了http://www.cnblogs.com/netflu/archive/2007/01/10/242038.html的代码。有了就没有必要再写了。可以读一下。不过我测试时发现了两次PageLoad的问题。注释了两句即可。同时修改了namespaces。同时提供完整的验证说明:
1 新建VerifyCode.aspx
cs文件代码如下:
using System;
using
 System.Collections;
using
 System.ComponentModel;
using
 System.Data;
using
 System.Web;
using
 System.Web.SessionState;
using
 System.Web.UI;
using
 System.Web.UI.WebControls;
using
 System.Web.UI.HtmlControls;

using
 System.Drawing;
using
 System.Drawing.Imaging;
using
 System.Drawing.Text;

///<summary>
/// 页面验证码程序
/// 使用:在页面中加入HTML代码 <img src="VerifyCode.aspx">

/// </summary>

public partial class VerifyCode : System.Web.UI.Page
{


    
static string[] FontItems  = new string[] 
{   "Arial"
                                                  
"Helvetica"

                                                  
"Geneva"

                                                  
"sans-serif"

                                                  
"Verdana"

                                              }
;

    
static Brush[] BrushItems = new Brush[] 
{     Brushes.OliveDrab,
                                                  Brushes.ForestGreen,
                                                  Brushes.DarkCyan,
                                                  Brushes.LightSlateGray,
                                                  Brushes.RoyalBlue,
                                                  Brushes.SlateBlue,
                                                  Brushes.DarkViolet,
                                                  Brushes.MediumVioletRed,
                                                  Brushes.IndianRed,
                                                  Brushes.Firebrick,
                                                  Brushes.Chocolate,
                                                  Brushes.Peru,
                                                  Brushes.Goldenrod
                                            }
;

    
static string[] BrushName = new string[] 
{    "OliveDrab",
                                                  
"ForestGreen"
,
                                                  
"DarkCyan"
,
                                                  
"LightSlateGray"
,
                                                  
"RoyalBlue"
,
                                                  
"SlateBlue"
,
                                                  
"DarkViolet"
,
                                                  
"MediumVioletRed"
,
                                                  
"IndianRed"
,
                                                  
"Firebrick"
,
                                                  
"Chocolate"
,
                                                  
"Peru"
,
                                                  
"Goldenrod"

                                             }
;

    
private static Color BackColor    =
  Color.White;
    
private static Pen   BorderColor  =
  Pens.DarkGray;
    
private static int   Width        =  52
;
    
private static int   Height       =  21
;

    
private
 Random _random;
    
private string
 _code;
    
private int
    _brushNameIndex;

    
    
override protected void
 OnInit(EventArgs e)
    
{
        
//

        
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
        
//

        
//InitializeComponent();
        
//base.OnInit(e);

    }

    
    
/**//// <summary>
    
/// Required method for Designer support - do not modify
    
///
 the contents of this method with the code editor.
    
/// </summary>

    private void InitializeComponent()
    
{    
        
//this.Load += new System.EventHandler(this.Page_Load);

    }




    
/// <summary>
    
/// 
    
/// </summary>

    
/// <param name="sender"></param>
    
/// <param name="e"></param>

    public void Page_Load(object sender, System.EventArgs e)
    
{
        
if (!
IsPostBack)
        
{
            
//

            
// TODO : initialize
            
//
            this._random = new
 Random();
            
this._code =
 GetRandomCode();

            
//

            
// TODO : use Session["code"] save the VerifyCode
            
//
            Session["code"= this
._code;

            
//

            
// TODO : output Image
            
//
            this
.SetPageNoCache();
            
this
.OnPaint();
        }

    }





    
/**//// <summary>
    
/// 设置页面不被缓存
    
/// </summary>

    private void SetPageNoCache()
    
{
        Response.Buffer 
= true
;
        Response.ExpiresAbsolute 
= System.DateTime.Now.AddSeconds(-1
);
        Response.Expires 
= 0
;
        Response.CacheControl 
= "no-cache"
;
        Response.AppendHeader(
"Pragma","No-Cache"
);
    }


    
/**//// <summary>
    
/// 取得一个 4 位的随机码
    
/// </summary>

    
/// <returns></returns>

    private string GetRandomCode()
    
{
        
return Guid.NewGuid().ToString().Substring(04
);
    }


    
/**//// <summary>
    
/// 随机取一个字体
    
/// </summary>

    
/// <returns></returns>

    private Font GetFont()
    
{
        
int fontIndex = _random.Next(0
, FontItems.Length);
        FontStyle fontStyle 
= GetFontStyle(_random.Next(02
));
        
return new Font(FontItems[fontIndex], 12
, fontStyle);
    }


    
/**//// <summary>
    
/// 取一个字体的样式
    
/// </summary>

    
/// <param name="index"></param>
    
/// <returns></returns>

    private FontStyle GetFontStyle(int index)
    
{
        
switch
 (index)
        
{
            
case 0
:
                
return
 FontStyle.Bold;
            
case 1
:
                
return
 FontStyle.Italic;
            
default
:
                
return
 FontStyle.Regular;
        }

    }


    
/**//// <summary>
    
/// 随机取一个笔刷
    
/// </summary>

    
/// <returns></returns>

    private Brush GetBrush()
    
{
        
int brushIndex = _random.Next(0
, BrushItems.Length);
        _brushNameIndex 
=
 brushIndex;
        
return
 BrushItems[brushIndex];
    }




    
/**//// <summary>
    
/// 绘画事件
    
/// </summary>

    private void OnPaint()
    
{
        Bitmap objBitmap 
= null
;
        Graphics g 
= null
;

        
try

        
{
            objBitmap 
= new
 Bitmap(Width, Height);
            g 
=
 Graphics.FromImage(objBitmap);

            Paint_Background(g);
            Paint_Text(g);
            Paint_TextStain(objBitmap);
            Paint_Border(g);

            objBitmap.Save(Response.OutputStream, ImageFormat.Gif);
            Response.ContentType 
= "image/gif"
;
        }

        
catch {}
        
finally
        
{
            
if (null !=
 objBitmap)
                objBitmap.Dispose();
            
if (null !=
 g)
                g.Dispose();
        }

    }


    
/**//// <summary>
    
/// 绘画背景颜色
    
/// </summary>

    
/// <param name="g"></param>

    private void Paint_Background(Graphics g)
    
{
        g.Clear(BackColor);
    }


    
/**//// <summary>
    
/// 绘画边框
    
/// </summary>

    
/// <param name="g"></param>

    private void Paint_Border(Graphics g)
    
{
        g.DrawRectangle(BorderColor, 
00, Width - 1, Height - 1
);
    }


    
/**//// <summary>
    
/// 绘画文字
    
/// </summary>

    
/// <param name="g"></param>

    private void Paint_Text(Graphics g)
    
{
        g.DrawString(_code, GetFont(), GetBrush(), 
31
);
    }


    
/**//// <summary>
    
/// 绘画文字噪音点
    
/// </summary>

    
/// <param name="g"></param>

    private void Paint_TextStain(Bitmap b)
    
{
        
for (int n=0; n<30; n++
)
        
{
            
int x =
 _random.Next(Width);
            
int y =
 _random.Next(Height);
            b.SetPixel(x, y, Color.FromName(BrushName[_brushNameIndex]));
        }


    }



}
 


 2 页面引用:

<asp:Image ID="getcode" src="VerifyCode.aspx" runat="server" />

一般需要同时提供刷新功能(看不清楚换一张),代码如下


    <asp:Image ID="getcode" src="VerifyCode.aspx" runat="server" />&nbsp;&nbsp;<A href="javascript:getimgcode()">刷新验证码</A>
 
超链接对应的javascript如下:

 <script language="javascript" type="text/javascript">
function getimgcode()
{
     var getimagecode = document.getElementById("getcode");
     getimagecode.src = "VerifyCode.aspx";
}
</script>

3 判断验证

   上述代码是将验证码存贮在Session中,用code来标志。读取代码
Session["code"].ToString();
   使用中,我们只需要比较
Session["code"].ToString()文本框输入的串(TextBoxCode.Text)是否相同即可进行判断。
        if(Session["code"].ToString().Trim().Equals(TextBoxCode.Text.Trim()))
        
{

            Response.Write(
"Success"
);
        }

测试通过!

posted on 2009-05-20 10:55  羊不再爱狼  阅读(434)  评论(0)    收藏  举报