注册的验证码怎么做?

时间:2021-07-26 17:11:18
看了别的验证码,一直没闹明白怎么做的,为什么验证码图片的img的src="xxx.aspx",可是xxx.aspx中只有很少的代码,xxx.aspx文件是什么作用啊?那些随机的验证数字是怎么显示在图片中的呢?

9 个解决方案

#1


学习

#2


http://renyu732.cnblogs.com/archive/2005/07/02/185161.html

#3


具体参考
http://singlepine.cnblogs.com/articles/264894.html

原理:在产生验证码的页面的Page_Load中调用产生随机数的函数,并把结果以流的方式输出到页面上,相当于画了个小图片,然后在另一个要使用验证码的页面中有个image,让image的src="ValidateCode.aspx",这样就把验证码以图片的方式显示到image里面去了。
private void Page_Load(object sender, System.EventArgs e)
{
Validate_Code(VNum);//调用产生验证码方法
}

以流方式输出到页面
private void Validate_Code(string VNum) 
{
            int Gheight=(int)(VNum.Length * 11.5);
            //gheight为图片宽度,根据字符长度自动更改图片宽度
            System.Drawing.Bitmap Img = new System.Drawing.Bitmap(Gheight,20);
            Graphics g = Graphics.FromImage(Img);
            g.DrawString(VNum,new System.Drawing.Font("Arial",10),new System.Drawing.SolidBrush(Color.Red),3,3); 
            //在矩形内绘制字串(字串,字体,画笔颜色,左上x.左上y) 
            System.IO.MemoryStream ms=new System.IO.MemoryStream();
            Img.Save(ms,System.Drawing.Imaging.ImageFormat.Png); 
            Response.ClearContent(); //需要输出图象信息 要修改HTTP头 
            Response.ContentType="image/Png";
            Response.BinaryWrite(ms.ToArray());
            g.Dispose();
            Img.Dispose(); 
            Response.End();
}
显示到图片上
<IMG alt="" src="ValidateCode.aspx">

#4


http://community.csdn.net/Expert/topic/4295/4295800.xml?temp=.3524286

#5


可以随机的在图片上画一些点,或线段,以防止被识别

#6


这种问题在CSDN的论坛里一搜就多的是了!

#7


我的实现方式:
http://blog.csdn.net/guanzhongs/archive/2005/12/29/564796.aspx

#8


<tr><TD align=right>驗証碼:
<asp:TextBox id="txtyz" runat="server" BorderColor="#333333" BorderWidth="1px"></asp:TextBox>
<td align=left width=120>&nbsp;<asp:Image id="Image1" runat="server" ImageUrl="YZgif.aspx"></asp:Image></td>
</TD></tr>

YZgif.aspx
<%@ Page Inherits="Exam.Admin.YZgif" Src="YZgif.cs" %>

YZgif.cs
using System;
using System.IO;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace Exam.Admin
{
/// <summary>
/// YZgif 的摘要说明。
/// </summary>
public class YZgif : System.Web.UI.Page
{
    protected System.Web.UI.WebControls.Image Image1;
        protected System.Web.UI.WebControls.TextBox txtyz;

private void Page_Load(object sender, System.EventArgs e)
{
string VNum = "";
VNum = this.RndNum(4);
Session["VNum"] = VNum;
this.ValidataCode(VNum);
// 在此处放置用户代码以初始化页面
}

#region Web Form Designer generated code
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

public void ValidataCode(string str)
{
System.Drawing.Bitmap Img;
Graphics g;
MemoryStream ms;
int gheight = str.Length*11;
Img = new Bitmap(gheight,20);
g = Graphics.FromImage(Img);
SolidBrush sb = new SolidBrush(Color.DarkSlateBlue);
Font ft = new Font("Arial",10);
g.DrawString(str,ft,sb,3,3);
ms = new MemoryStream();
Img.Save(ms,ImageFormat.Png);
Response.ClearContent();
Response.ContentType = "image/Png";
Response.BinaryWrite(ms.ToArray());
g.Dispose();
Img.Dispose();
Response.End();
}

public string RndNum(int i)
{
string VNum = "";
Random Rnd = new Random();
    string Vchar = "0,1,2,3,4,5,6,7,8,9";
string[] Vc = Vchar.Split(',');
for(int k =0;k<i;k++)
{
VNum = VNum + Vc[Rnd.Next(0,9)];
}
return VNum;
}
}
}

#9


using System;
using System.Data;
using System.Configuration;
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;


public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        CreateImage cc = new CreateImage();
        cc.DrawImage();
    }

        /// <summary>
/// 验证码模块
/// </summary>
public class CreateImage
{
public void DrawImage()
{
CreateImage img=new CreateImage();
HttpContext.Current.Session["CheckCode"]=img.RndNum(4);
img.CreateImages(HttpContext.Current.Session["CheckCode"].ToString());
}

/// <summary>
/// 生成验证图片
/// </summary>
/// <param name="checkCode">验证字符</param>
private void CreateImages(string checkCode)
{
int iwidth = (int)(checkCode.Length * 13);
System.Drawing.Bitmap image = new System.Drawing.Bitmap(iwidth, 23);
Graphics g = Graphics.FromImage(image);
g.Clear(Color.White);
//定义颜色
Color[] c = {Color.Black,Color.Red,Color.DarkBlue,Color.Green,Color.Orange,Color.Brown,Color.DarkCyan,Color.Purple};
//定义字体 
string[] font = {"Verdana","Microsoft Sans Serif","Comic Sans MS","Arial","宋体"};
Random rand = new Random();
//随机输出噪点
for(int i=0;i<50;i++)
{
int x = rand.Next(image.Width);
int y = rand.Next(image.Height);
g.DrawRectangle(new Pen(Color.LightGray, 1), x, y, 1 , 1);
}

//输出不同字体和颜色的验证码字符
for(int i=0;i<checkCode.Length;i++)
{
int cindex = rand.Next(7);
int findex = rand.Next(5);

Font f = new System.Drawing.Font(font[findex], 10, System.Drawing.FontStyle.Bold);
Brush b = new System.Drawing.SolidBrush(c[cindex]);
int ii=5;
if((i+1)%2==0)
{
ii=1;
}
g.DrawString(checkCode.Substring(i, 1), f, b, 3 + (i * 12), ii);//
}
//画一个边框
g.DrawRectangle(new Pen(Color.Black,1),0,0,image.Width-1,image.Height-1);

//输出到浏览器
System.IO.MemoryStream ms = new System.IO.MemoryStream();
image.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg);
HttpContext.Current.Response.ClearContent();
//Response.ClearContent();
HttpContext.Current.Response.ContentType = "image/Jpeg";
HttpContext.Current.Response.BinaryWrite(ms.ToArray());
g.Dispose();
image.Dispose();
}

/// <summary>
/// 生成随机的字母
/// </summary>
/// <param name="VcodeNum">生成字母的个数</param>
/// <returns>string</returns>
private string RndNum(int VcodeNum) 
{
string Vchar = "0,1,2,3,4,5,6,7,8,9" ;
string[] VcArray = Vchar.Split(',') ;
string VNum = "" ; //由于字符串很短,就不用StringBuilder了
int temp = -1 ; //记录上次随机数值,尽量避免生产几个一样的随机数

//采用一个简单的算法以保证生成随机数的不同
Random rand =new Random();
for ( int i = 1 ; i < VcodeNum+1 ; i++ ) 

if ( temp != -1) 
{
rand =new Random(i*temp*unchecked((int)DateTime.Now.Ticks));

int t = rand.Next(VcArray.Length ) ;
if (temp != -1 && temp == t) 
{
return RndNum( VcodeNum );
}
temp = t ;
VNum += VcArray[t];
}
return VNum ;
}
}


}

#1


学习

#2


http://renyu732.cnblogs.com/archive/2005/07/02/185161.html

#3


具体参考
http://singlepine.cnblogs.com/articles/264894.html

原理:在产生验证码的页面的Page_Load中调用产生随机数的函数,并把结果以流的方式输出到页面上,相当于画了个小图片,然后在另一个要使用验证码的页面中有个image,让image的src="ValidateCode.aspx",这样就把验证码以图片的方式显示到image里面去了。
private void Page_Load(object sender, System.EventArgs e)
{
Validate_Code(VNum);//调用产生验证码方法
}

以流方式输出到页面
private void Validate_Code(string VNum) 
{
            int Gheight=(int)(VNum.Length * 11.5);
            //gheight为图片宽度,根据字符长度自动更改图片宽度
            System.Drawing.Bitmap Img = new System.Drawing.Bitmap(Gheight,20);
            Graphics g = Graphics.FromImage(Img);
            g.DrawString(VNum,new System.Drawing.Font("Arial",10),new System.Drawing.SolidBrush(Color.Red),3,3); 
            //在矩形内绘制字串(字串,字体,画笔颜色,左上x.左上y) 
            System.IO.MemoryStream ms=new System.IO.MemoryStream();
            Img.Save(ms,System.Drawing.Imaging.ImageFormat.Png); 
            Response.ClearContent(); //需要输出图象信息 要修改HTTP头 
            Response.ContentType="image/Png";
            Response.BinaryWrite(ms.ToArray());
            g.Dispose();
            Img.Dispose(); 
            Response.End();
}
显示到图片上
<IMG alt="" src="ValidateCode.aspx">

#4


http://community.csdn.net/Expert/topic/4295/4295800.xml?temp=.3524286

#5


可以随机的在图片上画一些点,或线段,以防止被识别

#6


这种问题在CSDN的论坛里一搜就多的是了!

#7


我的实现方式:
http://blog.csdn.net/guanzhongs/archive/2005/12/29/564796.aspx

#8


<tr><TD align=right>驗証碼:
<asp:TextBox id="txtyz" runat="server" BorderColor="#333333" BorderWidth="1px"></asp:TextBox>
<td align=left width=120>&nbsp;<asp:Image id="Image1" runat="server" ImageUrl="YZgif.aspx"></asp:Image></td>
</TD></tr>

YZgif.aspx
<%@ Page Inherits="Exam.Admin.YZgif" Src="YZgif.cs" %>

YZgif.cs
using System;
using System.IO;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace Exam.Admin
{
/// <summary>
/// YZgif 的摘要说明。
/// </summary>
public class YZgif : System.Web.UI.Page
{
    protected System.Web.UI.WebControls.Image Image1;
        protected System.Web.UI.WebControls.TextBox txtyz;

private void Page_Load(object sender, System.EventArgs e)
{
string VNum = "";
VNum = this.RndNum(4);
Session["VNum"] = VNum;
this.ValidataCode(VNum);
// 在此处放置用户代码以初始化页面
}

#region Web Form Designer generated code
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

public void ValidataCode(string str)
{
System.Drawing.Bitmap Img;
Graphics g;
MemoryStream ms;
int gheight = str.Length*11;
Img = new Bitmap(gheight,20);
g = Graphics.FromImage(Img);
SolidBrush sb = new SolidBrush(Color.DarkSlateBlue);
Font ft = new Font("Arial",10);
g.DrawString(str,ft,sb,3,3);
ms = new MemoryStream();
Img.Save(ms,ImageFormat.Png);
Response.ClearContent();
Response.ContentType = "image/Png";
Response.BinaryWrite(ms.ToArray());
g.Dispose();
Img.Dispose();
Response.End();
}

public string RndNum(int i)
{
string VNum = "";
Random Rnd = new Random();
    string Vchar = "0,1,2,3,4,5,6,7,8,9";
string[] Vc = Vchar.Split(',');
for(int k =0;k<i;k++)
{
VNum = VNum + Vc[Rnd.Next(0,9)];
}
return VNum;
}
}
}

#9


using System;
using System.Data;
using System.Configuration;
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;


public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        CreateImage cc = new CreateImage();
        cc.DrawImage();
    }

        /// <summary>
/// 验证码模块
/// </summary>
public class CreateImage
{
public void DrawImage()
{
CreateImage img=new CreateImage();
HttpContext.Current.Session["CheckCode"]=img.RndNum(4);
img.CreateImages(HttpContext.Current.Session["CheckCode"].ToString());
}

/// <summary>
/// 生成验证图片
/// </summary>
/// <param name="checkCode">验证字符</param>
private void CreateImages(string checkCode)
{
int iwidth = (int)(checkCode.Length * 13);
System.Drawing.Bitmap image = new System.Drawing.Bitmap(iwidth, 23);
Graphics g = Graphics.FromImage(image);
g.Clear(Color.White);
//定义颜色
Color[] c = {Color.Black,Color.Red,Color.DarkBlue,Color.Green,Color.Orange,Color.Brown,Color.DarkCyan,Color.Purple};
//定义字体 
string[] font = {"Verdana","Microsoft Sans Serif","Comic Sans MS","Arial","宋体"};
Random rand = new Random();
//随机输出噪点
for(int i=0;i<50;i++)
{
int x = rand.Next(image.Width);
int y = rand.Next(image.Height);
g.DrawRectangle(new Pen(Color.LightGray, 1), x, y, 1 , 1);
}

//输出不同字体和颜色的验证码字符
for(int i=0;i<checkCode.Length;i++)
{
int cindex = rand.Next(7);
int findex = rand.Next(5);

Font f = new System.Drawing.Font(font[findex], 10, System.Drawing.FontStyle.Bold);
Brush b = new System.Drawing.SolidBrush(c[cindex]);
int ii=5;
if((i+1)%2==0)
{
ii=1;
}
g.DrawString(checkCode.Substring(i, 1), f, b, 3 + (i * 12), ii);//
}
//画一个边框
g.DrawRectangle(new Pen(Color.Black,1),0,0,image.Width-1,image.Height-1);

//输出到浏览器
System.IO.MemoryStream ms = new System.IO.MemoryStream();
image.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg);
HttpContext.Current.Response.ClearContent();
//Response.ClearContent();
HttpContext.Current.Response.ContentType = "image/Jpeg";
HttpContext.Current.Response.BinaryWrite(ms.ToArray());
g.Dispose();
image.Dispose();
}

/// <summary>
/// 生成随机的字母
/// </summary>
/// <param name="VcodeNum">生成字母的个数</param>
/// <returns>string</returns>
private string RndNum(int VcodeNum) 
{
string Vchar = "0,1,2,3,4,5,6,7,8,9" ;
string[] VcArray = Vchar.Split(',') ;
string VNum = "" ; //由于字符串很短,就不用StringBuilder了
int temp = -1 ; //记录上次随机数值,尽量避免生产几个一样的随机数

//采用一个简单的算法以保证生成随机数的不同
Random rand =new Random();
for ( int i = 1 ; i < VcodeNum+1 ; i++ ) 

if ( temp != -1) 
{
rand =new Random(i*temp*unchecked((int)DateTime.Now.Ticks));

int t = rand.Next(VcArray.Length ) ;
if (temp != -1 && temp == t) 
{
return RndNum( VcodeNum );
}
temp = t ;
VNum += VcArray[t];
}
return VNum ;
}
}


}