我们在上网的时候经常会看到网站上显示让输入验证码,网站上显示出来的验证码实际上是自动生成的图片,图片中的数字或者字母是随机生成的。其实现原理就是:首先系统随机生成几位的数字或者文字,数字、字母、或者文字都是随机生成并组合在一起的,有的是纯数字的组合,有的是纯字母的组合,有的是数字和字母的组合,还有的是汉字的组合,更有甚者,是一个算术公式,让写出答案。但无论哪一种验证码的方式,都是把随机生成的字符加以组合,这就成了我们看到的网上所显示的验证码。第二步是利用网页的技术,生成一个带有一定的背景图案的图片,然后将上面生成的验证码嵌入其中,这样我们就有了验证码的图片了。第三步,再利用网页的技术将上面生成的验证码图片显示在网页上。这就是验证码生成的过程,下面我们利用 ASP和ASP.NET结合起来的技术,简单说明一下网页上的验证码是怎么生成的。
一、随机生成验证码上的数字或者字母组合:
代码如下:
<%@ Language=VBScript %>
<%
'获取随机数字
function GetRandomNum(ilen)
dim s
Randomize
iSecond=cint(rnd()*100+datepart("s",now()))
iMinute=cint(rnd()*100+datepart("n",now()))
iHour=cint(rnd()*100+datepart("h",now()))
s=""
if len(iSecond)<2 then
s=s&"0"&iSecond
else
s=s&iSecond
end if
if len(iMinute)<2 then
s=s&"0"&iMinute
else
s=s&iMinute
end if
if len(iHour)<2 then
s=s&"0"&iHour
else
s=s&iHour
end if
GetRandomNum=left(s,ilen)
end function
function WriteCheckCode(sNum)
Dim url
url="http://......../CheckCode.aspx?id="&sNum&""
Dim http
set http = Server.CreateObject("Microsoft.XMLHTTP")
http.Open "GET", url, false
http.Send
Response.ContentType = "image/gif"
Response.BinaryWrite http.responseBody
Response.Flush
set http = nothing
end function
sNum=GetRandomNum(5)
session("UserCheckNum")=sNum
WriteCheckNum(sNum)
代码中的GetRandomNum函数的作用是自动生成随机数字,而WriteCheckCode函数的作用是将生成的验证码图片输出到网页上。
二、验证码图片的生成(CheckCode.aspx 代码)
代码如下:
using System;
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 WebUtils
{
public partial class WebForm : System.Web.UI.Page
{
protected void Page_Load(object sender, System.EventArgs e)
{
// 在此处放置用户代码以初始化页面
}
#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
DrawNumber();
}
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
}
#endregion
public void DrawNumber()
{
string auth_id = Request.QueryString["id"];
if(auth_id == null) auth_id = "";
Bitmap bmp = new Bitmap(60, 20);
Graphics g = Graphics.FromImage(bmp);
g.FillRectangle(Brushes.CadetBlue, 0, 0, bmp.Width, bmp.Height);
g.DrawString(auth_id, new Font("宋体", 15), Brushes.White, new RectangleF(new PointF(0, 0), new SizeF(bmp.Width, bmp.Height)));
Response.ContentType = "image/gif";
bmp.Save(Response.OutputStream, ImageFormat.Gif);
g.Dispose();
bmp.Dispose();
}
}
}
本段代码中的函数DrawNumber的作用是将随机生成的数字串嵌入图片中,生成验证码图片。
利用以上两部分代码,即可实现生成验证码的工作,有兴趣的读者可以在你们的网站服务器上测试一下。当然您也可以修改其中的部分代码,使得验证码看上去更加美观和复杂,如获取随机数字的部分,您可以修改为字母和数字结合的方式,图片的背景图案可以修改为花色的,这样的验证码更能给人以专业的感觉。