/* 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) 编辑 收藏
发表评论
本文把生成的验证码存入cookie确实不妥,我最近正好也在搞这个验证码.据我所知,一般是把生成的验证码存入session中的,用session.add()添加进入,然后验证的时候读取该值就可以了.
可以顯示驗證碼,但整個頁面就只能顯示這個驗證碼,其它的文本框還有圖像都不見了??這是怎麼回事?
@silenfir
怎么定义session的.如果把验证码放到image里,
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;
}
TO gwazy:
你可否按上边中留言所说将btnLogin_Click用session写出来?
我现在在学这个,恳请帮帮忙
晕,你傻啊,楼主只是给你提供了一种实现思路,具体把验证码保存到Cookies还是Session里,你自己不会改一下呀,叽叽歪歪,连这点能力都没有,还做什么程序!
private void Page_Load(object sender, System.EventArgs e)
{
if(!this.isPostBack)
{
this.CreateCheckCodeImage(GenerateCheckCode());
}
}
寫得很讚,謝謝你!
但我自己設計的畫面卻不見了,我需要TXT的欄位與驗證碼的欄位互相比較,
但只有秀出驗證碼,試很久卻沒辦法秀出我自設畫面,請問有什麼好的方法解決呢?
因為這範例寫得很好,很想套用到我所設計畫面中…
謝謝你囉!
刚学ASP.NET
打算做个论坛,正好能用上
谢谢楼主
大哥,你好强,小弟用了你的代码,居然一个错误也没有(代码写错很容易犯这毛病),很细心的!呵呵,你的C#学的不错啊.
有人在吗?我用了之后出现一个错误是:“btnLogin_Click”的重载均与委托“System.EventHandler”不匹配
能说说用ASP:BUTTON 的时候用那个来提交啊?谢谢了大哥
我自己改了一下 对了 强悍的人物THNAKS;你的代码写的真的好!!想你学习
你们好,可以告诉我江民杀毒软件2007的验证码吗?谢谢!
<%@ Page Language="C#" %>
说明:此页由大写26个英文字母随机抽取4个生成75(宽) x 35(高)的验证码图片,并将匹配字符串写入Session["vCode"]中<br />
用法:将验证码图像源绑定到此页上即可,例:<img alt="验证码" src="VCode.aspx" />
<%
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();
%>
生成验证码的页面也是需要身份验证后才可以访问这怎么办啊
这是我改写了一小部分的代码,见笑了啊。。。。(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
调用的部分:俺使用了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
这么老的方法还有人用!!!!!2002年的东东了!
竟然还有人说好!
你们是不是搞WEB开发的啊
前面得加一个system.drawing的命名空间
出售高级验证码识别引擎全部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
<script language=javascript></script>
<script language=javascript></script>
随机验证码不全
没有奇数和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);
}
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;
}
}
}
跟着你那代码一步一步走下来,发现原来有这么多好东西是自己不知道的,牛啊,顶
有个问题想请教一下楼主:
如果我想获取的数字不是随机生成的,而是用户输入的一段数字,并且我希望将该功能做成一个Web用户控件,在页面中需要的地方直接拖出使用,程序怎么写?
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 引入工具箱。
转换的数字是用户输入的,而不是在程序内定死的,以<IMG src="CheckCode.aspx">形式怎样去获取用户输入的数字呢?
我的想法是做一个web用户控件,以属性形式获取输入的数字再进行处理,但现在的问题是做成一个web用户控件后,无法具体定位图片在页面中的显示位置.
用户提交后,在 cookie 中是有的,
你做成用户控件,和普通控件一样可以控制位置啊。。。
可以显示验证码,但整个页面就只能显示验证码,其它的文本框还有图像都不见了
这个问题谁帮我解答 谢谢
先回覆觀看一下囉!!
最近專題在搞這種東西~~
快要被麻煩死了!!
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
}
}
}
有没有刷验证码的软件呀!!!怎么才能更快的打出正确的验证码那 !!
有没有软件.QQ289398480
我把验证码作成了一个用户自定义控件Validatecode.ascx ,因为我有几个页面都要使用这个控件,其中另一个控件需要使用Validatecode.ascx ,我就添加了这个控件,但是显示出来的却只有验证码那个控件中的其他元素却无法显示
郁闷中.......
出售蓝奇高级验证码识别引擎,可准确识别新浪动网淘宝CSDN等多种复杂验证码。
输出为一个标准DLL,可供VB,VC,Delphi,C#.NET,VB.NET,模拟精灵,按键精灵等多平台调用,调用方法简单,几行代码即可完成。独具特色的边缘检测字符分离、旋转倾斜纠正和通用字符匹配算法(无论字体和大小), 使得该引擎对于像新浪、动网、淘宝、CSDN等多种验证码均有不错的识别率,是一款效果较为理想的验证码识别引擎。附详细的调用实例和代码注释等相关技术文档。
@蓝奇高级验证码识别引擎QQ:631753663
很无耻
--引用--------------------------------------------------
yoyo: 可以顯示驗證碼,但整個頁面就只能顯示這個驗證碼,其它的文本框還有圖像都不見了??這是怎麼回事?
--------------------------------------------------------
不用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
{
//这里写验证码正确后的代码.......
}
}
这种验证 ,已经不能适应现在的社会了,有没有更高级点的验证
不会被一些,专门识别验证码的程序识别出来!
00看了你的帖子,非常有启发,http://www.rosegirl.cn