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();
   }
  }
 }


 

  假如以上验证码生成器页面名为: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;
   }

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

  }


posted @ 2005-04-18 09:53 gwazy 阅读(47374) 评论(128) 编辑 收藏

评论共2页: 上一页 1 2 
 回复 引用   
#28楼 2006-04-22 14:35 silenfir[未注册用户]
本文把生成的验证码存入cookie确实不妥,我最近正好也在搞这个验证码.据我所知,一般是把生成的验证码存入session中的,用session.add()添加进入,然后验证的时候读取该值就可以了.
 回复 引用   
#29楼 2006-05-05 09:40 yoyo[未注册用户]
可以顯示驗證碼,但整個頁面就只能顯示這個驗證碼,其它的文本框還有圖像都不見了??這是怎麼回事?
 回复 引用   
#30楼 2006-05-14 19:41 r[未注册用户]
fsf
 回复 引用   
#31楼 2006-05-22 08:02 韦[未注册用户]
@silenfir
怎么定义session的.如果把验证码放到image里,

 回复 引用   
#32楼 2006-05-25 02:04 rhodamine[未注册用户]
真牛皮
 回复 引用   
#33楼 2006-05-30 16:07 xiuaofeng[未注册用户]
看不懂 最好是制作出来的 或者是条款式演示出来

 回复 引用   
#34楼 2006-06-17 14:58 。。。[未注册用户]
@ASP.net 验证码(C#)
很棒!!

 回复 引用   
#35楼 2006-06-17 15:37 。。。[未注册用户]
private void Submit_Click(object sender, System.EventArgs e)
{
if((string)Session["checkCode"] == null)
{
lblMessage.Text = "您的浏览器设置已被禁用 Cookies,您必须设置浏览器允许使用 Cookies 选项后才能使用本系统。";
lblMessage.Visible = true;
return;
}

if(String.Compare((string)Session["checkCode"], TextBox1.Text, true) != 0)
{
lblMessage.Text = "验证码错误,请输入正确的验证码。";
lblMessage.Visible = true;
return;
}

lblMessage.Text = "验证码正确";
lblMessage.Visible = true;

}

 回复 引用 查看   
#36楼 2006-06-25 14:26 ipengjun      
TO gwazy:
你可否按上边中留言所说将btnLogin_Click用session写出来?
我现在在学这个,恳请帮帮忙

 回复 引用 查看   
#37楼 2006-06-27 13:27 小氕      
不错!
 回复 引用   
#38楼 2006-07-11 13:58 asda[未注册用户]
adasda
 回复 引用   
#39楼 2006-07-17 17:19 Gavin--------[未注册用户]
晕,你傻啊,楼主只是给你提供了一种实现思路,具体把验证码保存到Cookies还是Session里,你自己不会改一下呀,叽叽歪歪,连这点能力都没有,还做什么程序!
 回复 引用   
#40楼 2006-07-18 18:42 iv[未注册用户]
private void Page_Load(object sender, System.EventArgs e)
{
if(!this.isPostBack)
{
this.CreateCheckCodeImage(GenerateCheckCode());
}
}

 回复 引用   
#41楼 2006-07-20 17:18 huangquan[未注册用户]
谢谢啊,代码很有用
 回复 引用   
#42楼 2006-07-25 14:31 丰收[未注册用户]
谢谢楼主,正好要用到验证码,代码很好用,清晰明了
 回复 引用   
#43楼 2006-07-31 15:05 Diana[未注册用户]
寫得很讚,謝謝你!
但我自己設計的畫面卻不見了,我需要TXT的欄位與驗證碼的欄位互相比較,
但只有秀出驗證碼,試很久卻沒辦法秀出我自設畫面,請問有什麼好的方法解決呢?
因為這範例寫得很好,很想套用到我所設計畫面中…
謝謝你囉!

 回复 引用   
#44楼 2006-08-02 23:12 mg12[未注册用户]
刚学ASP.NET
打算做个论坛,正好能用上
谢谢楼主

 回复 引用   
#45楼 2006-08-18 17:29 cyong[未注册用户]
大哥,你好强,小弟用了你的代码,居然一个错误也没有(代码写错很容易犯这毛病),很细心的!呵呵,你的C#学的不错啊.
 回复 引用   
#46楼 2006-08-20 15:09 308828579[未注册用户]
谢谢了,,,真不错~~~~
 回复 引用   
#47楼 2006-08-29 10:22 hkyansir[未注册用户]
有人在吗?我用了之后出现一个错误是:“btnLogin_Click”的重载均与委托“System.EventHandler”不匹配
能说说用ASP:BUTTON 的时候用那个来提交啊?谢谢了大哥

 回复 引用   
#48楼 2006-08-29 13:22 hkyansir[未注册用户]
我自己改了一下 对了 强悍的人物THNAKS;你的代码写的真的好!!想你学习
 回复 引用   
#49楼 2006-09-06 13:37 Gugu[未注册用户]
一个更好的验证码控件,你连<IMG src="CheckCode.aspx">也用不着写,也用着检查是否支持Cookies:)
http://bbs.mscommunity.com/forums/ShowThread.aspx?PostID=48200

 回复 引用   
#50楼 2006-09-07 13:36 iiiii[未注册用户]
dsgdsf
 回复 引用   
#51楼 2006-10-26 16:09 tiger[匿名][未注册用户]
你们好,可以告诉我江民杀毒软件2007的验证码吗?谢谢!
 回复 引用   
#52楼 2006-11-06 16:48 pagedown[未注册用户]
http://www.pagedown.cn/Sequencenumber.asp

这个页面中有很多序列号,太多了列不出来,自己有空去看一下。
绝对没有病毒。。

 回复 引用   
#53楼 2007-02-27 23:28 打雷之后[未注册用户]
<%@ Page Language="C#" %>
说明:此页由大写26个英文字母随机抽取4个生成75(宽) x 35(高)的验证码图片,并将匹配字符串写入Session["vCode"]中<br />
用法:将验证码图像源绑定到此页上即可,例:&lt;img alt="验证码" src="VCode.aspx" /&gt;
<%
string vCode = string.Empty;
Random rand = new Random();
System.Drawing.Bitmap imgCode = new System.Drawing.Bitmap(75, 35);
System.Drawing.Graphics gImgCode = System.Drawing.Graphics.FromImage(imgCode);
gImgCode.Clear(System.Drawing.Color.White);
for (int y = 0; y < 35; y += 2)
for (int x = 0; x < 75; x += 2)
imgCode.SetPixel(x, y, System.Drawing.Color.FromArgb(rand.Next(256), rand.Next(256), rand.Next(256)));
for (int i = 0; i < 4; i++)
{
System.Drawing.Bitmap imgChar = new System.Drawing.Bitmap(30, 35);
System.Drawing.Graphics gImgChar = System.Drawing.Graphics.FromImage(imgChar);
gImgChar.Clear(System.Drawing.Color.Transparent);
gImgChar.RotateTransform((float)rand.Next(-20, 21));
vCode += "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[rand.Next(26)];
gImgChar.DrawString(vCode[i].ToString(), new System.Drawing.Font("黑体", 20), new System.Drawing.SolidBrush(System.Drawing.Color.FromArgb(rand.Next(150), rand.Next(150), rand.Next(150))), 5, 5);
gImgCode.DrawImageUnscaled(imgChar, i * 15, 0);
gImgChar.Dispose();
imgChar.Dispose();
}
Session.Add("vCode", vCode);
System.IO.MemoryStream ms = new System.IO.MemoryStream();
imgCode.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
gImgCode.Dispose();
imgCode.Dispose();
Response.ClearContent();
Response.ContentType = "image/jpeg";
Response.BinaryWrite(ms.ToArray());
Response.End();
%>

 回复 引用   
#54楼 2007-04-07 10:26 感觉没俊[未注册用户]
非常感谢楼主,做出来了
呵呵

 回复 引用   
#55楼 2007-04-28 17:44 luo [未注册用户]
生成验证码的页面也是需要身份验证后才可以访问这怎么办啊

 回复 引用   
#56楼 2007-04-30 10:36 one[未注册用户]
thanks
 回复 引用   
#57楼 2007-05-09 17:31 Danky[未注册用户]
这是我改写了一小部分的代码,见笑了啊。。。。(VB.NET)
主要变化:
我发现lz的代码只能生成0和A,。。。不知道是我的问题还是什么问题?
大家讨论说cookies不安全,那就改成SESSION了。。。
Partial Class UserMain_CheckCode
Inherits System.Web.UI.Page

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Me.CreateCheckCodeImage(GenerateCheckCode())
End Sub
Private Function GenerateCheckCode() As String
Dim number As Integer
Dim code As Char
Dim checkCode As String = [String].Empty

Dim random = New Random()

Dim i As Integer
For i = 0 To 4
number = random.Next()



If number Mod 2 = 0 Then
'这里使用了随机生成数字
code = CType(ChrW(random.Next(48, 57)), Char)
Else
'这是是随机生成字母,和ASSII代码表一样
code = CType(ChrW(random.Next(97, 123)), Char)
End If
checkCode += code.ToString()
Next i
checkcode=checkcode.ToUpper

'Response.Cookies.Add(New HttpCookie("CheckCode", checkCode))
'根据网友讨论,由于安全性的问题,改为使用Session
Session.Add("CheckCode", checkCode)

Return checkCode
End Function 'GenerateCheckCode


Private Sub CreateCheckCodeImage(ByVal checkCode As String)
If checkCode Is Nothing Or checkCode.Trim() = [String].Empty Then
Return
End If
Dim image As New System.Drawing.Bitmap(CInt(Math.Ceiling((checkCode.Length * 12.5))), 22)
Dim g As Drawing.Graphics = Drawing.Graphics.FromImage(image)

Try
'生成随机生成器
Dim random As New Random()

'清空图片背景色
g.Clear(Drawing.Color.White)

'画图片的背景噪音线
Dim i As Integer
For i = 0 To 24
Dim x1 As Integer = random.Next(image.Width)
Dim x2 As Integer = random.Next(image.Width)
Dim y1 As Integer = random.Next(image.Height)
Dim y2 As Integer = random.Next(image.Height)

g.DrawLine(New Drawing.Pen(Drawing.Color.Silver), x1, y1, x2, y2)
Next i

Dim font = New System.Drawing.Font("Arial", 12, System.Drawing.FontStyle.Bold Or System.Drawing.FontStyle.Italic)
Dim brush As New System.Drawing.Drawing2D.LinearGradientBrush(New Drawing.Rectangle(0, 0, image.Width, image.Height), Drawing.Color.Blue, Drawing.Color.DarkRed, 1.2F, True)
g.DrawString(checkCode, font, brush, 2, 2)

'画图片的前景噪音点
' Dim i As Integer
For i = 0 To 99
Dim x As Integer = random.Next(image.Width)
Dim y As Integer = random.Next(image.Height)

image.SetPixel(x, y, Drawing.Color.FromArgb(random.Next()))
Next i

'画图片的边框线
g.DrawRectangle(New Drawing.Pen(Drawing.Color.Silver), 0, 0, image.Width - 1, image.Height - 1)

Dim ms As 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()
End Try
End Sub 'CreateCheckCodeImage
End Class

 回复 引用   
#58楼 2007-05-09 17:33 Danky[未注册用户]
调用的部分:俺使用了SPAN
If Session("CheckCode") Is Nothing Then
newpwd.InnerHtml = "<br><img src=../Images/prohibition.gif width=49 height=50 /> 您的浏览器设置已被禁用 Cookies,您必须设置浏览器允许使用 Cookies 选项后才能使用本系统!"
newpwd.Visible = True
Return
End If

If [String].Compare(Session("CheckCode").ToString, TextBox3.Text, True) <> 0 Then
newpwd.InnerHtml = "<br><img src=../Images/prohibition.gif width=49 height=50 /> 验证码错误,请输入正确的验证码!"
newpwd.Visible = True
Return
'终止
Response.End()
End If

 回复 引用   
#59楼 2007-05-10 08:14 光之君[未注册用户]
这么老的方法还有人用!!!!!2002年的东东了!
竟然还有人说好!
你们是不是搞WEB开发的啊

 回复 引用   
#60楼 2007-05-13 11:25 shanying[未注册用户]
牛人,谢谢了
 回复 引用   
#61楼 2007-05-13 11:26 shanying[未注册用户]
ret
 回复 引用   
#62楼 2007-06-04 10:25 leilei[未注册用户]
111111111111111
 回复 引用   
#63楼 2007-06-07 11:51 46464[未注册用户]
前面得加一个system.drawing的命名空间
 回复 引用   
#64楼 2007-06-19 02:56 zz[未注册用户]
zz
 回复 引用   
#65楼 2007-06-20 08:51 dfsad[未注册用户]
afasdfasgfdgdfg
 回复 引用 查看   
#66楼 2007-06-22 23:35 蓝色奇迹      
出售高级验证码识别引擎全部Delphi源码,可准确识别新浪动网百度淘宝QQ等多种复杂验证码

输出为一个标准DLL,可供VB,VC,Delphi,C#.NET,VB.NET等多平台调用,其中用到了Transym OCR识别引

擎(国外最强悍的商业OCR),另外加上独具特色的边缘检测字符分离、旋转倾斜纠正和通用字符匹配算

法(无论字体和大小),使得该引擎对于像新浪、动网、淘宝、QQ、百度等多种验证码均有理想的识别

率,是目前国内非常出色的验证码识别引擎。附详细的调用实例和代码注释。价格500元。提供售后技术

支持,协助客户调试代码。联系作者QQ:631753663

效果怎么样一试就知道。
DEMO下载 (电信)***/soft/advocr.rar
     (网通)cnc.purejoy.cn/soft/advocr.rar

 回复 引用   
#67楼 2007-06-25 20:00 魂牵梦萦[未注册用户]
@liujj
魂牵梦萦

 回复 引用   
#68楼 2007-07-12 11:56 ww[未注册用户]
<script language=javascript></script>
 回复 引用   
#69楼 2007-07-12 11:57 ww[未注册用户]
&lt;script language=javascript&gt;&lt;/script&gt;
 回复 引用   
#70楼 2007-07-15 14:15 Carmen[未注册用户]
Hello!
I'm Carmen

 回复 引用   
#71楼 2007-07-17 17:36 达到[未注册用户]
太好了
 回复 引用   
#72楼 2007-07-25 11:14 godfather[未注册用户]
谢谢,太又用拉
 回复 引用   
#73楼 2007-07-31 17:46 蜗牛淡淡[未注册用户]
感谢!!!
 回复 引用   
#74楼 2007-08-01 16:32 dd[未注册用户]
Thank you
 回复 引用   
#75楼 2007-08-09 13:04 小林[未注册用户]
谢谢了!
 回复 引用   
#76楼 2007-08-21 15:24 sky2008[未注册用户]
随机验证码不全
没有奇数和A、C、E之类的代码
最好换个写法

int number;
char code_let,code_num;
string checkCode = String.Empty;

System.Random random = new Random();

for(int i=0; i<2; i++)
{
number = random.Next();

code_num = (char)('0' + (char)(number % 10));
code_let = (char)('A' + (char)(number % 26));

checkCode += code_num.ToString();
checkCode += code_let.ToString();
//要添加加到Session中
Session.Add("CheckCode", checkCode);
}

 回复 引用   
#77楼 2007-08-22 15:32 er[未注册用户]
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Web.UI;
using System.Drawing.Drawing2D;
using System.IO;
namespace Validate
{
/// <summary>
/// 生成验证码的类
/// </summary>
public class ValidateNumber
{
public ValidateNumber()
{
}
/// <summary>
/// 验证码的最大长度
/// </summary>
public int MaxLength
{
get{return 10;}
}
/// <summary>
/// 验证码的最小长度
/// </summary>
public int MinLength
{
get{return 1;}
}
/// <summary>
/// 生成验证码
/// </summary>
/// <param name="length">指定验证码的长度</param>
/// <returns></returns>
public string CreateValidateNumber(int length)
{
int[] randMembers=new int[length];
int[] validateNums=new int[length];
string validateNumberStr="";
//生成起始序列值
int seekSeek=unchecked((int)DateTime.Now.Ticks);
Random seekRand=new Random(seekSeek);
int beginSeek=(int)seekRand.Next(0,Int32.MaxValue-length*10000);
int[] seeks=new int[length];
for(int i=0;i<length;i++)
{
beginSeek+=10000;
seeks[i]=beginSeek;
}
//生成随机数字
for(int i=0;i<length;i++)
{
Random rand=new Random(seeks[i]);
int pownum=1*(int)Math.Pow(10,length);
randMembers[i]=rand.Next(pownum,Int32.MaxValue);
}
//抽取随机数字
for(int i=0;i<length;i++)
{
string numStr=randMembers[i].ToString();
int numLength=numStr.Length;
Random rand=new Random();
int numPosition=rand.Next(0,numLength-1);
validateNums[i]=Int32.Parse(numStr.Substring(numPosition,1));
}
//生成验证码
for(int i=0;i<length;i++)
{
validateNumberStr+=validateNums[i].ToString();
}
return validateNumberStr;
}
/// <summary>
/// 创建验证码的图片
/// </summary>
/// <param name="containsPage">要输出到的page对象</param>
/// <param name="validateNum">验证码</param>
public void CreateValidateGraphic(Page containsPage,string validateNum)
{
Bitmap image=new Bitmap((int)Math.Ceiling(validateNum.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 Font("Arial",12,(FontStyle.Bold|FontStyle.Italic));
LinearGradientBrush brush=new LinearGradientBrush(new Rectangle(0,0,image.Width,image.Height),
Color.Blue,Color.DarkRed,1.2f,true);
g.DrawString(validateNum,font,brush,3,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);
//保存图片数据
MemoryStream stream=new MemoryStream();
image.Save(stream,ImageFormat.Jpeg);
//输出图片
containsPage.Response.Clear();
containsPage.Response.ContentType="image/jpeg";
containsPage.Response.BinaryWrite(stream.ToArray());
}
finally
{
g.Dispose();
image.Dispose();
}
}
/// <summary>
/// 得到验证码图片的长度
/// </summary>
/// <param name="validateNumLength">验证码的长度</param>
/// <returns></returns>
public static int GetImageWidth(int validateNumLength)
{
return (int)(validateNumLength*12.5);
}
/// <summary>
/// 得到验证码的高度
/// </summary>
/// <returns></returns>
public static double GetImageHeight()
{
return 22.5;
}
}
}

 回复 引用   
#78楼 2007-08-22 15:34 er[未注册用户]
啊就是就是@snowman

 回复 引用   
#79楼 2007-09-06 10:14 HAPPYFOREVER[未注册用户]
相当不错,很适用,借用一下了,哈哈,谢谢!
 回复 引用   
#80楼 2007-09-21 19:46 翁[未注册用户]
跟着你那代码一步一步走下来,发现原来有这么多好东西是自己不知道的,牛啊,顶
 回复 引用   
#81楼 2007-09-24 15:38 wwe[未注册用户]
谢谢了,回去试试!
 回复 引用   
#82楼 2007-09-27 09:27 lyun[未注册用户]
有个问题想请教一下楼主:
如果我想获取的数字不是随机生成的,而是用户输入的一段数字,并且我希望将该功能做成一个Web用户控件,在页面中需要的地方直接拖出使用,程序怎么写?

 回复 引用   
#83楼 2007-09-27 09:54 gwazycn[未注册用户]
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();
}

你把这改成你想要的字符串

你想做成 dll
创建自定义控件,把代码改改就行,然后把 dll 引入工具箱。

 回复 引用   
#84楼 2007-09-27 11:47 lyun[未注册用户]
转换的数字是用户输入的,而不是在程序内定死的,以<IMG src="CheckCode.aspx">形式怎样去获取用户输入的数字呢?
我的想法是做一个web用户控件,以属性形式获取输入的数字再进行处理,但现在的问题是做成一个web用户控件后,无法具体定位图片在页面中的显示位置.

 回复 引用 查看   
#85楼[楼主] 2007-09-27 15:07 gwazy      
用户提交后,在 cookie 中是有的,
你做成用户控件,和普通控件一样可以控制位置啊。。。

 回复 引用 查看   
#86楼[楼主] 2007-09-27 16:28 gwazy      
http://www.cnblogs.com/gwazy/archive/2007/09/27/908198.html

这是我帮你该后的,你参考一下。。

 回复 引用   
#87楼 2007-10-05 23:54 佚名中[未注册用户]
很好。雪鞋
 回复 引用   
#88楼 2007-10-10 08:47 刘刚[未注册用户]
才看一点,觉得很好
先回帖
谢谢楼主

 回复 引用   
#89楼 2007-10-11 10:39 ddf[未注册用户]
wdggggggg
 回复 引用   
#90楼 2007-10-11 17:54 dfsf[未注册用户]
fddddddddddddddddddd
 回复 引用   
#91楼 2007-10-12 18:48 何足道[未注册用户]
能用,不错了.各位要知足

 回复 引用   
#92楼 2007-10-12 18:49 何足道[未注册用户]
能用,不错了.
 回复 引用   
#93楼 2007-10-12 18:49 何足道[未注册用户]
能用,不错了.
 回复 引用   
#94楼 2007-10-26 08:32 sdald[未注册用户]
sdfasd
 回复 引用   
#95楼 2007-10-29 15:35 yanfang[未注册用户]
借用,谢谢
 回复 引用   
#96楼 2007-11-02 10:28 游客[未注册用户]
谢谢,代码清晰易懂 :)
 回复 引用   
#97楼 2007-11-06 16:05 天下第1刀[未注册用户]
我先试一下去,谢谢。
 回复 引用   
#98楼 2007-11-08 13:37 hannnnn[未注册用户]
可以显示验证码,但整个页面就只能显示验证码,其它的文本框还有图像都不见了
这个问题谁帮我解答 谢谢

 回复 引用   
#99楼 2007-11-12 17:37 gtetr[未注册用户]
<aaa>
 回复 引用   
#100楼 2007-11-15 11:10 小葉[未注册用户]
先回覆觀看一下囉!!
最近專題在搞這種東西~~
快要被麻煩死了!!

 回复 引用   
#101楼 2007-11-16 11:49 sean.zhang [未注册用户]
个人觉得放在cookie中十分的不安全。
 回复 引用   
#102楼 2007-11-19 21:23 丝袜[未注册用户]
是呀.
 回复 引用   
#103楼 2007-11-29 21:31 qq:50876418[未注册用户]
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;
using System.IO;

namespace AJAXEnabledWebApplication1
{
public partial class _Default : System.Web.UI.Page
{
string _str_code = "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";
int _int_length = 5;
protected void Page_Load(object sender, EventArgs e)
{
//Response.Write(view_code());
string stra = view_code();
view_img(stra);
}

private string view_code()
{
string str_return = "";
String[] arr_ov = _str_code.Split(new char[] {','});
Random rand = new Random(unchecked((int)DateTime.Now.Ticks));
int int_start = -1;

for (int i=0;i<_int_length;i++)
{
int_start = rand.Next(0, arr_ov.Length - 1);
str_return+=arr_ov[int_start];
}

return str_return;
}
private void view_img(string _str_code)
{
Bitmap img = new Bitmap(60, 22); //图象的大小
Graphics ps = Graphics.FromImage(img); //封装
ps.Clear(Color.White); //背景颜色为白

Font ft = new Font("Arial", 12, (FontStyle.Bold)); //文本字体 大小 加粗
LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, img.Width, img.Height), Color.Blue, Color.DarkBlue, 1.2f); //封装 文本的位置 大小 和颜色

System.Drawing.Image img_a=System.Drawing.Image.FromFile(Server.MapPath("~")+@"\BackImage.gif"); //嵌入到图片中
ps.DrawImage(img_a,3,3); //绘制指定大小

ps.DrawString(_str_code, ft, brush, 2, 2); //字符与边框的左右距离
ps.DrawRectangle(new Pen(Color.SkyBlue), new Rectangle(0, 0, img.Width - 1, img.Height - 1));

MemoryStream ms = new MemoryStream(); //内存流
img.Save(ms, ImageFormat.Gif); //指定的图象格式 保存

Response.ClearContent(); //清除暖冲流中的所有内容的输出
Response.ContentType = "image/Gif"; //图片 类型
Response.BinaryWrite(ms.ToArray()); //将整个输出流的内容 转换 成为 字节数组

ps.Dispose(); //释放 ps
ms.Dispose(); //释放 ms
}
}
}

 回复 引用   
#104楼 2007-11-30 14:57 瞿静[未注册用户]
OK
 回复 引用   
#105楼 2007-12-23 11:17 ddf[未注册用户]
对我也是这么认为的呢
 回复 引用   
#106楼 2008-01-03 11:14 xiao zhao[未注册用户]
有没有刷验证码的软件呀!!!怎么才能更快的打出正确的验证码那 !!
有没有软件.QQ289398480

 回复 引用   
#107楼 2008-01-04 13:00 xxxx[未注册用户]
xxx
 回复 引用   
#108楼 2008-01-05 21:19 泡泡糖[未注册用户]
呵呵,不错呀
我把验证码作成了一个用户自定义控件Validatecode.ascx ,因为我有几个页面都要使用这个控件,其中另一个控件需要使用Validatecode.ascx ,我就添加了这个控件,但是显示出来的却只有验证码那个控件中的其他元素却无法显示

郁闷中.......

 回复 引用 查看   
#110楼[楼主] 2008-01-21 09:51 gwazy      
http://www.cnblogs.com/gwazy/archive/2007/09/27/908198.html

这是我帮你该后的,你参考一下。。

楼上,验证码控件

出售蓝奇高级验证码识别引擎,可准确识别新浪动网淘宝CSDN等多种复杂验证码。

输出为一个标准DLL,可供VB,VC,Delphi,C#.NET,VB.NET,模拟精灵,按键精灵等多平台调用,调用方法简单,几行代码即可完成。独具特色的边缘检测字符分离、旋转倾斜纠正和通用字符匹配算法(无论字体和大小), 使得该引擎对于像新浪、动网、淘宝、CSDN等多种验证码均有不错的识别率,是一款效果较为理想的验证码识别引擎。附详细的调用实例和代码注释等相关技术文档。

 回复 引用   
#112楼 2008-04-11 10:31 yuanhu[未注册用户]
hao de kan kan
 回复 引用   
#113楼 2008-04-26 22:37 aafd[未注册用户]
@ME
Study!

 回复 引用   
#114楼 2008-04-26 22:51 MC[未注册用户]
@蓝奇高级验证码识别引擎QQ:631753663
很无耻

 回复 引用   
#115楼 2008-05-25 07:34 wewew4413165[未注册用户]
我真的中了吗

 回复 引用   
#116楼 2008-06-07 20:52 黄随平[未注册用户]
--引用--------------------------------------------------
yoyo: 可以顯示驗證碼,但整個頁面就只能顯示這個驗證碼,其它的文本框還有圖像都不見了??這是怎麼回事?
--------------------------------------------------------

 回复 引用   
#117楼 2008-06-09 05:47 vbmn[未注册用户]
zcxsazxc

 回复 引用   
#118楼 2008-06-27 11:18 Mark(J)[未注册用户]
不用cookies的话可以换成session
用session的好处: 如果客户端禁用cookies的话要让用户自己设置,有些用户不会设置,而且如果客户机长时间没有清理临时文件的话那么可能在执行的时候会花上一定的时间来写入cookies.这里个人建议使用session,这样的话在服务器端执行好后只是做一个判断就可以验证了.
更改这段代码 Response.Cookies.Add(new HttpCookie("CheckCode", checkCode));
改为 session["CheckCode"] = checkCode;即可

服务器端验证写为
button 的click事件里
if(session["CheckCode"] != null)
{
if(text1.Text != session["CheckCode"].tostring() )
{
response.write("<script language='javascript'>alert('验证码错误!');'');
}
else
{
//这里写验证码正确后的代码.......
}

}

 回复 引用   
#119楼 2008-09-24 15:40 aadididi[未注册用户]
怎么实现点击验证码图片换一个验证码
 回复 引用   
#120楼 2008-11-06 10:36 有意义[未注册用户]
这种验证 ,已经不能适应现在的社会了,有没有更高级点的验证

不会被一些,专门识别验证码的程序识别出来!

 回复 引用   
#121楼 2008-11-09 21:06 YABE[未注册用户]
請問我要怎麼做到像下面這網址一樣呢?
我想和他一樣,任何人都可以使用,而不限定使用權限
請問我要將上面的程式放在哪裡呢?
http://www.apc.gov.tw/chinese/opinion/opinionAdd.jsp

 回复 引用   
#122楼 2008-11-21 11:35 YABE[未注册用户]
as
 回复 引用   
#123楼 2008-12-02 17:17 刘标[未注册用户]
Thanks for you```
 回复 引用   
#124楼 2009-04-28 09:54 xf81568930[未注册用户]
Thanks
 回复 引用   
#125楼 2009-09-15 11:42 hedan8399[未注册用户]
请问,我在网上查东西,为什么老查不到呢?
 回复 引用   
#126楼 2009-12-01 16:20 ymcsskill[未注册用户]
00看了你的帖子,非常有启发,http://www.rosegirl.cn
 回复 引用 查看   
#127楼 2011-07-20 09:15 Anna2Serena      
谢谢啦,第一次用,就这么顺利~
评论共2页: 上一页 1 2