黑马程序员技术交流社区
标题:
用户登录验证码的设计
[打印本页]
作者:
黄冉
时间:
2012-11-3 19:20
标题:
用户登录验证码的设计
很多网站登录,不仅需要输入用户名和密码,还需要输入验证码。但是这个验证码不是不变的,而是变化的。并且这些验证码添加了白噪声和背景噪线。之前也看过好几本关于网站开发的书,也接触了好几个关于这方面的编程方法,分享给大家。
//这个函数主要就是为了产生随机验证码的内容。也就是随机数
private string code(int a)//形参a是代表要生成几位随机数。可以在其它函数中调用这个函数。
{
string str="ABCD1EF2GH3JK4LM5NP6QR7ST8UV9WXY0Z";
char[] ch=str.ToCharArray();
StringBuilder strsb=new StringBuilder();
Random rd=new Random();
for(int i=0;i<a;i++)
{
strsb.Append(str.Substring(rd.Next(0,str.Length),1));//以str的长度产生随机位置,截取该位置的字符添加到strsb中。
}
return strsb.Tostring();
}
//有了随机数,还需要经过一些处理,比如加入白噪声,背景噪线等等。
public void ProcessRequest(HttpContext context)
{
string str = code(4);
context.Session["strcode"] = str;
Bitmap image = new Bitmap(120, 30);
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);
}
LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 3, true);
g.DrawString(str, new System.Drawing.Font("Arial", 20, (System.Drawing.FontStyle.Bold)), brush, 5, 2);
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, ImageFormatConverter.Gif);
context.Response.ClearContent();
context.Response.ContentType = "image/Gif";
context.Response.BinaryWrite(ms.ToArray());
}
finally
{
g.Dispose();
image.Dispose();
}
}
//这边需要注意的是,这个函数是我们在建立一个网站项目的时候,在这个项目里面添加一个一般处理程序。然后就会自动生成这个函数我们只需要在里面添加这些代码就可以了。注:当我们使用一般处理程序的时候,此方法是自动被调用的。这个方法的大概思路就是:将我们生成的四位随机数再生成图片信息,然后对图片添加一些噪声保存到输出流中。第二段代码看上去很长,其实只要知道验证码的生成过程就行了。里面的很多函数也许不是很熟悉,但这不是问题,因为我们不知道的函数太多了,只有多用才能熟练的掌握。
作者:
许庭洲
时间:
2012-11-3 20:38
值得学习ing!
作者:
许庭洲
时间:
2012-11-3 20:41
本帖最后由 许庭洲 于 2012-11-3 20:53 编辑
程序中
值得学习
的地方:
1. ToCharArray():如果要对char进行修改,那么就必须创建一个新的字符串,用s.ToCharArray()方法得到字符串的char数组;
2. StringBuilder(): 如果要操作一个不断增长的字符串,尽量不用String类,改用StringBuilder类;
3. Substring(); string Substring(int startIndex, int length), 取从位置startIndex开始长度为length的子字符串,如果子字符串的长度不足length则报错。
作者:
郑昱曦
时间:
2012-11-5 13:19
技巧值得学习
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2