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

  验证码技术是为了防止暴力破解等而设定的。现在一般的网站注册等都提供验证码功能,特别是腾讯更是长长的一串。文中参考了别人的代码。有了就没有必要再写了。可以读一下。不过我测试时发现了两次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(0, 4);

  }

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

  /// 随机取一个字体

  /// </summary>

  /// <returns></returns>

  private Font GetFont()

  ...{

  int fontIndex = _random.Next(0, FontItems.Length);

  FontStyle fontStyle = GetFontStyle(_random.Next(0, 2));

  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, 0, 0, Width - 1, Height - 1);

  }

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

  /// 绘画文字

  /// </summary>

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

  private void Paint_Text(Graphics g)

  ...{

  g.DrawString(_code, GetFont(), GetBrush(), 3, 1);

  }

  /**//**//**//// <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" />  <A href="javascript:getimgcode()">刷新验证码</A>

  如使用了母版页,则用如下代码:

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

  <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");

  }

  测试通过!