请问网站登陆中的那个随机生成的图片验证码是怎么实现的呢???
解决方案 »
- 配置图片服务器报错“已经达到网络 BIOS 命令限制”
- log4net 怎么在记录文件中显示详细信息错误
- 征集基于asp.net的cms系统以供学习和研究(自己先发几个)
- 数据库添加数据时发生数据错乱,怎么解决??????
- 网站并发性问题和浮动窗体问题
- 请问框架窗体间的通讯怎么实现?
- 求救:在asp.net中,我用C#把页面导入到excel时,无法看到图片,有什么办法可以把网页中的图片导入到excel吗?急啊!恳请诸位大侠援手帮
- 翻页怎么做
- 高手:麻烦给我一个满意的答案!谢谢,困惑我一段时间了
- <asp:label>和<asp:textbox >可以放在<ItemTemplate></ItemTemplate>之间吗?帮帮忙吧
- 通过DefaultView.Sort对网格排序的问题
- Console.WriteLine("aabb");为什么不显示?
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;
}
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;namespace WebApplication2
{
/// <summary>
/// VerifyCode 的摘要说明。
/// </summary>
public class VerifyCode : System.Web.UI.Page
{
private void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面 if (!IsPostBack)
{
Random seedRnd = new Random();
double verifyCode= seedRnd.Next(10000, 99999); Session["regpass"]=verifyCode.ToString(); Bitmap image = new Bitmap ( 60 , 20 ); Graphics g = Graphics.FromImage(image) ; g.FillRectangle (new SolidBrush(Color.FromArgb(200,200,200)),0 ,0 ,60,20) ;
Font axesFont = new Font ( "Arial Black" , 12 ) ; Brush blackBrush = new SolidBrush ( Color . Black ) ; g.DrawString(verifyCode.ToString(),axesFont,blackBrush,-1,-1 ) ;
//Font axesFont = new Font ( "Arial Black" , 6 ) ;
//Brush blackBrush = new SolidBrush ( Color.FromArgb(220,220,220)) ;
//循环写入乱七八糟文字。
/*
int x1;
int x2;
int y1;
int y2;
int h=1;
Pen rndPen = new Pen ( Color.White , 1 ) ;
while (h<100)
{
x1=Rnd1.Next(0,60);
x2=Rnd1.Next(0,60);
y1=Rnd1.Next(0,30);
y2=Rnd1.Next(0,30);
g . DrawLine ( rndPen , x1 , y1 , x1+2 , y1+2 ) ;
h++;
}
*/
Pen grayPen = new Pen ( Color.DarkGray , 2 ) ;
g.DrawLine ( grayPen , 0 , 0 , 0 , 20 ) ;
g.DrawLine ( grayPen , 60 , 0 , 60 , 20) ;
g.DrawLine ( grayPen , 0 , 0 , 60 , 0 ) ;
g.DrawLine ( grayPen , 0 , 20 , 60 , 20 ) ;
image.Save( Response.OutputStream,ImageFormat.Jpeg);
}//if }// Page_Load #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
}
}
这个是用随生成的汉字,比数字的更好!
经典
public string CutStr(string str,int n)//可能是让返回的字符串占N个字节
{
string ss="";//返回值
if (str.Length<=n/2)
{
ss=str;
}
else
{
int t=0;
char[] tmp=str.ToCharArray();
for (int i=0;i<str.Length;i++)
{
int c;
//c=Convert.ToInt32(str.Substring(i,1));
c=(int)tmp[i];
if (c<0)
c=c+65536;
if (c>255)
t=t+2;
else
t=t+1;
if (t>n)
break;
ss=ss+str.Substring(i,1);
}
}
return ss;}public string CutStrWithD(string str,int n)
{
string ss="";//返回值
if (str.Length<=n/2)
{
ss=str;
}
else
{
int t=0;
char[] tmp=str.ToCharArray();
for (int i=0;i<str.Length;i++)
{
int c;
//c=Convert.ToInt32(str.Substring(i,1));
c=(int)tmp[i];
if (c<0)
c=c+65536;
if (c>255)
t=t+2;
else
t=t+1;
if (t>n)
break;
ss=ss+str.Substring(i,1);
}
ss=ss+"...";
}
return ss;
}
//字母区分大小写
//参数为生成随机数的位数
public 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(35) ;
int t=rand.Next(10);
if (temp != -1 && temp == t)
{
return RndNum( VcodeNum );
}
temp = t ;
VNum += VcArray[t];
}
return VNum ;//它肯定不是四位?
}
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 ;
}
}
}
Asp.Net 动态生成验证码