SW515

SunWu Software Studio

用户操作
[即时聊天] [发私信] [加为好友]
钟峰ID:SW515
140266次访问,排名575好友0人,关注者0
SW515的文章
原创 53 篇
翻译 0 篇
转载 10 篇
评论 277 篇
SW515的公告

  本人的博客站点已经转移到博客园去了,地址是:http://SW515.
cnblogs.com


  并再次感谢您的关注与勉励!


访问量统计:

找网站找123

最近评论
chattie:怎么没有图。
suchangcheng:aa
litchitids:引用了那些类呢?~~
oldhen:你好,这段代码有改进吗?也就是for asp.net 2.0的?
SW515:请楼上的明示,哪本书上有原文或代码跟本人这篇帖子的代码一样啊?本人这篇文章的代码绝对百分百原创!!!

声明:本人博客内的所有帖子,如果是转载都会写明“转载”,如果有出处,也一定会指明出处。否则均为原创!欢迎监督指正!
文章分类
收藏
相册
家人朋友
我的相册
反馈跟踪
OleDbClient 中关于 OleDbTransaction 对象的传递问题
友情链接
dahuzizyd
Free.net
MSPlus[ASP.net 控件开发]
SunSnow8
博客堂(RSS)
古月春秋(RSS)
我在博客园的博客(RSS)
阿阙
存档
软件项目交易
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
订阅到BlogLines
订阅到Yahoo
订阅到GouGou
订阅到飞鸽
订阅到Rojo
订阅到newsgator
订阅到netvibes

原创 ASP.net 验证码(C#)收藏

新一篇: 一天中的七杯水 | 旧一篇: 转换字符串中汉字为其拼音缩写(C#)

/* Copyright all(c) 2005 ZhongFeng, http://blog.csdn.net/SW515 */
 public class ValidateCode : System.Web.UI.Page
 {
  private void Page_Load(object sender, System.EventArgs e)
  {
   this.CreateCheckCodeImage(GenerateCheckCode());
  }

  #region Web 窗体设计器生成的代码
  override protected void OnInit(EventArgs e)
  {
   //
   // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
   //

   InitializeComponent();
   base.OnInit(e);
  }
  
  /// <summary>
  /// 设计器支持所需的方法 - 不要使用代码编辑器修改
  /// 此方法的内容。
  /// </summary>

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

  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.Silver), x1, y1, x2, y2);
    }

    Font font = new System.Drawing.Font("Arial", 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<100; 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.Silver), 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();
    Response.ContentType = "image/Gif";
    Response.BinaryWrite(ms.ToArray());
   }
   finally
   {
    g.Dispose();
    image.Dispose();
   }
  }
 }


 

  假如以上验证码生成器页面名为:CheckCode.aspx,那么在登录页面中使用“<IMG>” 这个 HTML 元素来显示生成的验证码图片:<IMG src="CheckCode.aspx">
  在登录页面的登录按钮的处理事件中使用以下代码判断验证码:

  private void btnLogin_Click(object sender, System.Web.UI.ImageClickEventArgs e)
  {
   if(Request.Cookies["CheckCode"] == null)
   {
    lblMessage.Text = "您的浏览器设置已被禁用 Cookies,您必须设置浏览器允许使用 Cookies 选项后才能使用本系统。";
    lblMessage.Visible = true;
    return;
   }

   if(String.Compare(Request.Cookies["CheckCode"].Value, txtCheckCode.Text, true) != 0)
   {
    lblMessage.Text = "验证码错误,请输入正确的验证码。";
    lblMessage.Visible = true;
    return;
   }

        /*****    *****/

  }





效果图:


 

  你可以使用或部分引用该段代码,不过必须保留以上版权注释部分内容,并注释代码来源,否则将保留追究侵权的权利!

发表于 @ 2005年02月03日 16:08:00|评论(loading...)|编辑

新一篇: 一天中的七杯水 | 旧一篇: 转换字符串中汉字为其拼音缩写(C#)

评论

#Tong118 发表于2006-01-25 14:06:00  IP: 211.100.21.*
TrackBack来自《网上几种常见校验码图片分析》

前几天受刺激了,准备把CSDN的校验码图片修改。就上网找了一些参考示例。和分析了一些校验码的功能。不敢独享,整理到一起,跟大家分享。

至于CSDN新的校验码写法,不是这里面的任何一种。也不是网上可以找到的。这个不好公开,如果想研究校验码图片,建议研究我这里给的几个推荐链接。
#tom 发表于2006-02-04 21:13:00  IP: 211.100.21.*
TrackBack来自《FW:网上几种常见校验码图片分析》

网上几种常见校验码图片分析
#jxufewbt 发表于2006-02-23 15:53:00  IP: 211.100.21.*
TrackBack来自《网上几种常见校验码图片分析 》

转载自http://blog.joycode.com/ghj/archive/2005/12/28/69611.aspx
#ASP.NET 发表于2006-03-04 22:38:00  IP: 61.183.139.*
TrackBack来自《网上几种常见校验码图片分析》

前几天受刺激了,准备把CSDN的校验码图片修改。就上网找了一些参考示例。和分析了一些校验码的功能。不敢独享,整理到一起,跟大家分享。
至于CSDN新的校验码写法,不是这里面的任何一种。也不是网上可以找到的。这个不好公开,如果想研究校验码图片,建议研究我这里给的几个推荐链接。...
#H_J_H 发表于2006-03-16 12:03:00  IP: 211.100.21.*
TrackBack来自《网上几种常见校验码图片分析》

网上几种常见校验码图片分析
#jwt 发表于2005-02-24 21:37:00  IP: 202.196.47.*
真的不错哦,呵呵,我学了不少呢,多谢共享啊,呵呵
#hzgood 发表于2005-03-24 12:45:00  IP: 218.249.27.*
very good, 不过有个小问题 , 我认证通过了后在后退, 那个验证码没有变, 而且还抱错, (当然,肯定不时你的代码问题,)不知道应该如何进行刷新。
#SW515 发表于2005-03-25 09:41:00  IP: 61.144.207.*
To hzgood:
  通过了验证之后,再回退是不会再刷新页面,所以该验证码还是原来的那个,我觉得这个应该是合理的,因为你并没有安全退出(Session.Abandon()),如果你使用了安全退出的话,那么就再也不能回退到原来的那个验证码了。


  如果报错,那应该是你的代码问题了,我这边不会出现错误。
#堕落的精林 发表于2005-05-02 17:28:00  IP: 61.171.56.*
在CheckCode.aspx的html的<head></head>中加入以下代码,后退验证码会刷新。
<% Response.Buffer = true ;%>
<% Response.ExpiresAbsolute = DateTime.Now.AddSeconds(-1);%>
<% Response.Expires = 0 ;%>
<% Response.CacheControl = "no-cache" ; %>
#milk3q 发表于2005-05-27 17:29:00  IP: 61.186.252.*
多谢你们啊,我这次可以把它用上了
#SW515 发表于2005-06-03 15:04:00  IP: 61.186.252.*
To 夏禾:
  谢谢,你的引用对我而言是莫大的鼓励!呵呵,并再次感谢你的这种版权保护意识~ ^_^
#夏禾 发表于2005-06-02 21:30:00  IP: 61.186.252.*
谢谢了 我是个生手 引用了你的代码 而且注明了代码的出处 呵呵 我的保护知识版权的意识还比较好
#精品烂人 发表于2005-06-20 21:18:00  IP: 61.186.252.*
我用了你的东西,也加上你的版权了。
谢谢你了,ZhongFeng
#bing 发表于2005-06-30 23:14:00  IP: 61.186.252.*
非常感谢!
运行正常!
我也保留了你的版权信息,多谢共享!
#MM 发表于2005-07-01 17:57:00  IP: 61.186.252.*
谢谢,,
#bing 发表于2005-07-03 12:08:00  IP: 61.186.252.*
可以让在验证码错误的时候不刷新可以吗?
就象requiredfieldvalidator一样?
#wsaspx 发表于2005-09-10 05:02:00  IP: 211.100.21.*
怎么不用viewstate?
#wsaspx 发表于2005-09-10 05:02:00  IP: 211.100.21.*
怎么不用viewstate?
#小桥 发表于2005-09-15 07:42:00  IP: 211.100.21.*
这种方法并不好,将验证码存在客户端的Cookie里,并不是安全的做法!
#大桥 发表于2005-10-31 14:15:00  IP: 61.183.78.*
我觉得也是
#SW515 发表于2005-11-11 16:34:00  IP: 218.17.73.*
  其实把验证码放在ViewState里面也是不安全的,因为默认ViewState也是明文的。当然,如果在将验证码存入Cookies或者ViewState里面之前先进行加密则会好很多!

  不过,个人认为其实在这个方案里,将验证码放在Session里面去最好的,因为验证码很小,不会占用多少服务器资源,也更安全些!
#劳动肉蛋 发表于2005-12-26 20:23:00  IP: 221.204.3.*
谢谢!!!学到不少,继续努力,加油!
#劳动肉蛋  发表于2005-12-26 20:41:00  IP: 221.204.3.*
我想在我的blog上面转载你的文章可以么??我肯定会注明出处的,我得经过你的允许才可以。
#SW515 发表于2005-12-29 16:14:00  IP: 218.17.73.*
To 劳动肉蛋:
可以转载,只要注明出处就可以了!!谢谢~
#丫头 发表于2006-01-04 12:14:00  IP: 61.233.172.*
真的谢谢你,我学会不少东西,我是新手
#十年 发表于2006-01-19 14:36:00  IP: 221.226.122.*
关于回退图片的问题,在页面中加meta解决不了
Response.ClearContent();
Response.ContentType = "image/Gif";
Response.BinaryWrite(ms.ToArray());
在上面Response.ClearContent();已经清除了头,所以在定义了
ContentType后必须再加入
Response.CacheControl = "no-cache";
Response.Expires = "-1";
这样在向浏览器输出图片流前就告诉了浏览器要立即失效,才能解决回退后刷新验证码的问题。不过我用VB做的。昨天查了大部分资料,很少有这样做,大家可以试验下。另验证码存在Session中比较合理,最好再加密。
#过客 发表于2006-09-12 12:17:00  IP: 61.144.33.*
回退时网页肯定是有必要刷新的,否则随便编个程序就穷举法也能把校验码试出来。
#过客 发表于2006-09-21 15:42:00  IP: 219.140.156.*
这不就是一本书上的原例子吗?
数据,注释都没改?
唉,现在的人啊.......
#SW515 发表于2006-09-25 17:17:00  IP: 58.61.85.*
请楼上的明示,哪本书上有原文或代码跟本人这篇帖子的代码一样啊?本人这篇文章的代码绝对百分百原创!!!

声明:本人博客内的所有帖子,如果是转载都会写明“转载”,如果有出处,也一定会指明出处。否则均为原创!欢迎监督指正!
#oldhen 发表于2006-10-10 21:59:00  IP: 218.66.210.*
你好,这段代码有改进吗?也就是for asp.net 2.0的?
#litchitids 发表于2008-02-14 12:19:16  IP: 58.253.241.*
引用了那些类呢?~~
发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © SW515