ASP.net 验证码(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();
   }
  }
 }

2....        

Asp.net(C#)实现验证码功能

Posted on 2004-10-20 17:03 边城浪子 阅读(6512) 评论(40)   编辑  收藏 收藏至365Key 所属分类: .NET(C#) href="http://www.cnblogs.com/index/Services/Pingback.aspx" rel="pingback"/>

新建一个专门用来创建验证码图片的页面ValidateCode.aspx
它的后台cs文件代码如下:
PageLoad

private   void  Page_Load( object  sender, System.EventArgs e)
        
{
            
string checkCode = CreateRandomCode(4);
            Session[
"CheckCode"= checkCode;
            CreateImage(checkCode);
        }

其中CreateRandomCode是自定义的函数,参数代表验证码位数

private   string  CreateRandomCode( int  codeCount)
        
{
            
string allChar = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,W,X,Y,Z" ;
            
string[] allCharArray = allChar.Split(',');
            
string randomCode = "";
            
int temp = -1;

            Random rand 
= new Random();
            
for(int i = 0; i < codeCount; i++)
            
{
                
if(temp != -1)
                
{
                    rand 
= new Random(i*temp*((int)DateTime.Now.Ticks));
                }

                
int t = rand.Next(35);
                
if(temp == t)
                
{
                    
return CreateRandomCode(codeCount);
                }

                temp 
= t;
                randomCode 
+= allCharArray[t];
            }

            
return randomCode;
        }

CreateImage也是一个自定义的函数,用于生成图

private   void  CreateImage( string  checkCode)
        
{
            
int iwidth = (int)(checkCode.Length * 11.5);
            System.Drawing.Bitmap image 
= new System.Drawing.Bitmap(iwidth, 20);
            Graphics g 
= Graphics.FromImage(image);
            Font f 
= new System.Drawing.Font("Arial"10, System.Drawing.FontStyle.Bold);
            Brush b 
= new System.Drawing.SolidBrush(Color.White);
            
//g.FillRectangle(new System.Drawing.SolidBrush(Color.Blue),0,0,image.Width, image.Height);
            g.Clear(Color.Blue);
            g.DrawString(checkCode, f, b, 
33);

            Pen blackPen 
= new Pen(Color.Black, 0);
            Random rand 
= new Random();
            
for (int i=0;i<5;i++)
            
{
                
int y = rand.Next(image.Height);
                g.DrawLine(blackPen,
0,y,image.Width,y);
            }

            
            System.IO.MemoryStream ms 
= new System.IO.MemoryStream();
            image.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg);
            Response.ClearContent();
            Response.ContentType 
= "image/Jpeg";
            Response.BinaryWrite(ms.ToArray());
            g.Dispose();
            image.Dispose();
        }

//g.FillRectangle(new System.Drawing.SolidBrush(Color.Blue),0,0,image.Width, image.Height);
g.Clear(Color.Blue);
这两种方法都可以改变生成图片的背景颜色
下面那个for循环用来生成一些随机的水平线

在需要用到验证码的页面添加一个<asp:Image>控件即可,但是要把ImageUrl指向生成验证码的页面

< asp:Image Runat = " server "  ID = " ImageCheck "  ImageUrl="ValidateCode.aspx" ></ asp:Image >

Feedback

# re: Asp.net(C#)实现验证码功能   

2004-10-20 19:51 by Tmouse
正需要,谢谢。

# re: Asp.net(C#)实现验证码功能   

2004-10-21 08:44 by 灵感之源
1、字符串的每个字符的字体都随机?
2、字符串的每个字符的位置都随机?如上下,倾斜等等
3、既然有垂直线,那干脆把水平线也加上,而且这些先的位置和数量应该是随机的;
4、干脆把弄写随机点吧:)

# re: Asp.net(C#)实现验证码功能   

2004-10-21 09:12 by 边城浪子
这个只是初步实现了验证码的功能,其它的我都还没有考虑呢。
1,字体随机。这个应该可以做到,不难。
2,位置随机。上下应该可以做到,只是倾斜不好办,难道用斜体代替?
3,水平线。加上不难,只是这个加多了就会阻碍用户识别了吧。
4,不明白什么意思

谢谢灵感之源哦

# re: Asp.net(C#)实现验证码功能   

2004-10-21 17:06 by Goodspeed
能让背景透明的吗?

# re: Asp.net(C#)实现验证码功能   

2004-10-21 23:02 by myxname
你这样做来点IE后退骓证码不变的吧. 我原来这样做的.后来改为:
<script>document.write("<img src='ValidateImg.aspx?strimg=",Math.random(),"' >");</script> 这样点IE的后退都重生成.

# re: Asp.net(C#)实现验证码功能   

2004-10-21 23:12 by myxname
灵感之源的随机点就是背景改为那小数点的. 那样不要垂直线,水平线了, 有时在别人网上可以看到这样的.
有个方法是直接加一张小点点的背景图,然后在上面写字. 有点像水印了哦.:P

# re: Asp.net(C#)实现验证码功能   

2004-10-22 11:26 by 边城浪子
to myxname
试过了,还是不会变
这个应该和在哪个页面验证有关
如果就在当前页进行验证的话还是不会改变

# re: Asp.net(C#)实现验证码功能   

2004-11-17 02:08 by 蜗牛
那么在页面如何知道这个验证码的值

if ( lblValidate.Text = ViewState["CheckCode"] )
{
lblDisplay.Text = "验证通过";
}
else
{
lblDisplay.Text = "所填写的验证码与所给的不符";
}
为什么不行的?

# re: Asp.net(C#)实现验证码功能   

2004-11-17 13:12 by 边城浪子
to 蜗牛:
Session["CheckCode"] = checkCode;
不是放在ViewState里的,是放在Session里的

# re: Asp.net(C#)实现验证码功能   

2004-11-17 17:50 by 蜗牛
if ( lblValidate.Text == Session["CheckCode"].ToString())
{
lblDisplay.Text = "验证通过";
}
else
{
lblDisplay.Text = "所填写的验证码与所给的不符";
}
为什么老提示“所填写的验证码与所给的不符”

# re: Asp.net(C#)实现验证码功能   

2004-11-17 19:25 by 边城浪子
具体的我也不太清楚
你监视一下程序
看看生成的checkcode和页面上显示的是否一致

# re: Asp.net(C#)实现验证码功能   

2004-11-17 22:01 by 蜗牛
我就是用你的程序,然后在login.aspx调用。
我要显示Session["CheckCode"].ToString(); 的值,但出现错误。
错误:未将对象引用设置到对象的实例。

# re: Asp.net(C#)实现验证码功能   

2004-11-18 10:37 by qqq

private string CreateRandomCode(int codeCount)
{
string allChar = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,W,X,Y,Z" ;
string[] allCharArray = allChar.Split(',');
string randomCode = "";
int temp = -1;

Random rand = new Random();
for(int i = 0; i < codeCount; i++)
{
if(temp != -1)
{
rand = new Random(i*temp*((int)DateTime.Now.Ticks));
}
int t = rand.Next(35);
if(temp == t)
{
return CreateRandomCode(codeCount);
}
temp = t;
randomCode += allCharArray[t];
}
return randomCode;
}

# re: Asp.net(C#)实现验证码功能   

2004-11-18 10:38 by ddddddddddddd
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace WebApplication2
{
/// <summary>
/// ValidateCode 的摘要说明。
/// </summary>
public class ValidateCode : System.Web.UI.Page
{
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
string checkCode = CreateRandomCode(4);
Session["CheckCode"]=checkCode;
CreateImage(checkCode);

}

private string CreateRandomCode(int codeCount)
{
string allChar = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,W,X,Y,Z" ;
string[] allCharArray = allChar.Split(',');
string randomCode = "";
int temp = -1;

Random rand = new Random();
for(int i = 0; i < codeCount; i++)
{
if(temp != -1)
{
rand = new Random(i*temp*((int)DateTime.Now.Ticks));
}
int t = rand.Next(35);
if(temp == t)
{
return CreateRandomCode(codeCount);
}
temp = t;
randomCode += allCharArray[t];
}
return randomCode;
}

private void CreateImage(string checkCode)
{
int iwidth = (int)(checkCode.Length * 11.5);
System.Drawing.Bitmap image = new System.Drawing.Bitmap(iwidth, 20);
Graphics g = Graphics.FromImage(image);
Font f = new System.Drawing.Font("Arial", 10, System.Drawing.FontStyle.Bold);
Brush b = new System.Drawing.SolidBrush(Color.White);
//g.FillRectangle(new System.Drawing.SolidBrush(Color.Blue),0,0,image.Width, image.Height);
g.Clear(Color.Blue);
g.DrawString(checkCode, f, b, 3, 3);

Pen blackPen = new Pen(Color.Black, 0);
Random rand = new Random();
for (int i=0;i<5;i++)
{
int y = rand.Next(image.Height);
g.DrawLine(blackPen,0,y,image.Width,y);
}

System.IO.MemoryStream ms = new System.IO.MemoryStream();
image.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg);
Response.ClearContent();
Response.ContentType = "image/Jpeg";
Response.BinaryWrite(ms.ToArray());
g.Dispose();
image.Dispose();
}

#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
}
}

# re: Asp.net(C#)实现验证码功能   

2004-11-20 13:48 by 我阿犬
TO:蜗牛
if (Page.IsPostBack )
{
if(TxtRand.Value.ToString()== Session["CheckCode"].ToString())
{
Response.Write("111");
Response.End();
}
}
你窗体刚加载Session当然没有了 这个对象你既没有定义null 又没声明
即使if(Session["CheckCode"]==null)也会出错 得等窗体提交的时候
因为窗体初始的时候动态图片正在生成中 Session也在创建中。
这个写的比 http://www.21tx.com/dotnet/wz/37WKOBMXZZPN1NJCHS.shtml
这里的好,可是作者有个函数写的不好,影响性能如下:
private string CreateRandomCode(int codeCount)
{
string allChar = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,W,X,Y,Z" ;
string[] allCharArray = allChar.Split(',');
string randomCode = "";
int temp = -1;

Random rand = new Random();
for(int i = 0; i < codeCount; i++)
{
if(temp != -1)
{
rand = new Random(i*temp*((int)DateTime.Now.Ticks));
}
int t = rand.Next(35);
if(temp == t)
{
return CreateRandomCode(codeCount); //这里如果随机数字经常重复就是死循环了,当然不能经常重复,但是整个函数又要重新开始,影响性能是不是????????
}
temp = t;
randomCode += allCharArray[t];
}
return randomCode;
}
return CreateRandomCode(codeCount); //这里如果随机数字经常重复就是死循环了,当然不能经常重复,但是整个函数又要重新开始,影响性能是不是????????

# re: Asp.net(C#)实现验证码功能   

2004-12-01 15:15 by 初学者
谢谢!
不过随机横线有时候会妨碍识别。
不知能否提供贵站所使用的验证图片生成代码啊?:)

# re: Asp.net(C#)实现验证码功能   

2004-12-01 19:22 by 边城浪子
贵站?
你是说博客园么?
这里的老大是dudu
你去问问他吧
http://www.cnblogs.com/dudu

# re: Asp.net(C#)实现验证码功能   

2004-12-09 20:20 by ^o^ 毛毛 ^o^
请问

rand = new Random(i*temp*((int)DateTime.Now.Ticks));

这一句是做什么用的啊?

# re: Asp.net(C#)实现验证码功能   

2004-12-11 15:04 by 111
【摘要】
全球网络的普及,使得网站建设的地位变得不可动摇!互联网随之而然地成为了人们生活中的必须!个人网页的制作已逐渐广泛,能够拥有体现自己个性的网页,就必须体现自己的优势,使网页动态化。
用ASP这种动态服务器网页配合后台链接的数据库SQL,ACCESS等对自己网站论坛的内容增加审核功能即所有网友发到论坛的文章,并不立即被显示出来,必须经过站长或者版主审阅之后,认为有价值,有必要推荐给其它网友的,就发表出来。否则就删掉了,免得浪费空间,,这样的论坛能够提供给为明确有益的内容放到网站上,能够吸引更多的网友来访问。

关键词:ASP动态服务器,SQL,ACCESS,数据库,后台链接,论坛

# re: Asp.net(C#)实现验证码功能   

2004-12-22 10:03 by Chap
要是能实现这个页面所用的验证图片就好了!

# Asp.net(C#)实现验证码功能(ZT)[TrackBack]   

2004-12-23 02:00 by pwrjng2
Ping Back来自:blog.csdn.net
pwrjng2引用了该文章,地址: http://blog.csdn.net/pwrjng2/archive/2004/12/23/225936.aspx

# re: Asp.net(C#)实现验证码功能   

2004-12-23 17:14 by Deboy_W
Random r = new Random();
for(int i = 0;i<codeCount;i++)
{
randomCode += allCharArray[r.Next(0,35)];
}
这样有什么不好/

# re: Asp.net(C#)实现验证码功能   

2004-12-25 13:50 by 234
博客的随机码是怎么弄得
有没有好看一点

# re: Asp.net(C#)实现验证码功能   

2004-12-25 14:18 by 阿斗分
怎样把背景弄成透明的

# re: Asp.net(C#)实现验证码功能   

2005-01-12 10:31 by Richard
我这样调用,也提示未将对象引用设置到对象的实例
行 62: if (strValidate.Text.Trim() == Session["CheckCode"].ToString().Trim())


private void btnLogin_Click(object sender, System.EventArgs e)
{
string tmpErrMsg = "";
if (strValidate.Text.Trim() == Session["CheckCode"].ToString().Trim())
{
tmpErrMsg = tmpErrMsg.ToString().Trim() + "验证码匹配失败!<br>";
}
ErrMsg.Text = tmpErrMsg;
}

# re: Asp.net(C#)实现验证码功能   

2005-01-12 10:39 by 边城浪子
确保你的Session["CheckCode"]存在
不存在的就不能ToString()了

所以最前面应该加上判断

# re: Asp.net(C#)实现验证码功能   

2005-02-19 13:58 by SW515
本人也写了一个这样的,见笑了:

http://blog.csdn.net/sw515/archive/2005/02/03/279364.aspx

# re: Asp.net(C#)实现验证码功能   

2005-02-19 14:00 by SW515
本人也写了一个这样的,见笑了:
http://blog.csdn.net/sw515/archive/2005/02/03/279364.aspx


效果图:
http://blog.csdn.net/images/blog_csdn_net/sw515/17120/o_CheckCode.gif

# re: Asp.net(C#)实现验证码功能   

2005-02-19 14:07 by SW515
本人也写了一个这样的,见笑了:
http://blog.csdn.net/sw515/archive/2005/02/03/279364.aspx


效果图:
http://blog.csdn.net/images/blog_csdn_net/sw515/17120/o_CheckCode.gif

# re: Asp.net(C#)实现验证码功能   

2005-02-19 14:49 by SW515
本人也写了一个这样的,见笑了:
http://blog.csdn.net/sw515/archive/2005/02/03/279364.aspx


效果图:
http://blog.csdn.net/images/blog_csdn_net/sw515/17120/o_CheckCode.gif

# re: Asp.net(C#)实现验证码功能   

2005-02-23 09:03 by nanfansky
性能问题,建议改改CreateRandomCode函数
发现前面有人提过了,修改如下

private string CreateRandomCode(int CodeCount)
{
string allChar = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z";
string[] allCharArray = allChar.Split(Convert.ToChar(","));
string RandomCode = "";
int temp = -1;

Random rand = new Random();
for (int i=0;i<CodeCount;i++)
{
if (temp != -1)
{
rand = new Random(temp*i*((int) DateTime.Now.Ticks));
}

int t = rand.Next(35);

while (temp == t)
{
t = rand.Next(35);
}

temp = t;
RandomCode += allCharArray[t];
}

看是否合适?

# re: Asp.net(C#)实现验证码功能   

2005-02-23 09:46 by nanfansky
性能与取Z字母
对CreateRandomCode函数的修改:
private string CreateRandomCode(int CodeCount)
{
string allChar = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z";
string[] allCharArray = allChar.Split(Convert.ToChar(","));
string RandomCode = "";
int temp = -1;

Random rand = new Random();
for (int i=0;i<CodeCount;i++)
{
if (temp != -1)
{
rand = new Random(temp*i*((int) DateTime.Now.Ticks));
}

int t = rand.Next(36);

while (temp == t)
{
t = rand.Next(36);
}

if (t==35)
{
Console.WriteLine(t.ToString() + "|" + i.ToString());
}
temp = t;
RandomCode += allCharArray[t];
}

return RandomCode;
}

# re: Asp.net(C#)实现验证码功能   

2005-03-11 13:47 by baoaya
//history back 不重复
Response.Cache.SetNoStore();//这一句
Response.ClearContent();
Response.ContentType = "image/Jpeg";
Response.BinaryWrite(ms.ToArray());

//增加一个验证的函数
public static bool CheckCode(string strCode)
{
strCode=strCode.ToUpper();
string strSessionCode=System.Web.HttpContext.Current.Session["CheckCode"]+"";
strSessionCode=strSessionCode.ToUpper();
System.Web.HttpContext.Current.Session["CheckCode"]=null;//注意要清空,防止一个session时间内攻击
return (strSessionCode==strCode);
}

# re: Asp.net(C#)实现验证码功能   

2005-03-18 18:29 by hubro
http://www.hubro.net/?id=40

# re: Asp.net(C#)实现验证码功能   

2005-07-06 10:39 by 高天蒲
今天看到大哥的文章,
受益无穷,谢谢啦。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值