验证码的例子(转)
今天做了几个例子,是关于验证码的,其实验证码不难,你只要理解它的组成,就能学明白了。看了几个例子发现了验证码其实就是一个页面。比如我们有两个页 面,code.aspx和png.aspx,这里我们假设code就是所谓我们发帖的地方,在此页面我们放个image控件,
<asp:Image ID="Image1" runat="server" ImageUrl="png.aspx" />
这里我们发现什么了呢?
很简单,就是我们生成随机数和干扰图片都是在一个页面内完成的。做好这个,我们就能往下做了,这里很简单了下面我们就来做一个简单的例子就行了,生成随机汉字的吧。
我们建个网站就叫confirmcode,然后在里面建了连个页面code.aspx和png.aspx。如图
在这里code.aspx我们展示,png的动态生成样式。
我们首先设计png.aspx让其生成一个随机汉字字符串。这里编写了两个方法。
public static object[] CreateRegionCode(int strlength)
{
//定义一个字符串数组储存汉字编码的组成元素
string[] rBase = new String[16] { "0", "1", "2", "3", "4", "5",
"6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
Random rnd = new Random();
//定义一个object数组用来
object[] bytes = new object[strlength];
for (int i = 0; i < strlength; i++)
{
//区位码第1位
int r1 = rnd.Next(11, 14);
string str_r1 = rBase[r1].Trim();
//区位码第2位
rnd = new Random(r1 * unchecked((int)DateTime.Now.Ticks) +
i);//更换随机数发生器的种子避免产生重复值
int r2;
if (r1 == 13)
{
r2 = rnd.Next(0, 7);
}
else
{
r2 = rnd.Next(0, 16);
}
string str_r2 = rBase[r2].Trim();
//区位码第3位
rnd = new Random(r2 * unchecked((int)DateTime.Now.Ticks) +
i);
int r3 = rnd.Next(10, 16);
string str_r3 = rBase[r3].Trim();
//区位码第4位
rnd = new Random(r3 * unchecked((int)DateTime.Now.Ticks) +
i);
int r4;
if (r3 == 10)
{
r4 = rnd.Next(1, 16);
}
else if (r3 == 15)
{
r4 = rnd.Next(0, 15);
}
else
{
r4 = rnd.Next(0, 16);
}
string str_r4 = rBase[r4].Trim();
//定义两个字节变量存储产生的随机汉字区位码
byte byte1 = Convert.ToByte(str_r1 + str_r2, 16);
byte byte2 = Convert.ToByte(str_r3 + str_r4, 16);
//将两个字节变量存储在字节数组中
byte[] str_r = new byte[] { byte1, byte2 };
//将产生的一个汉字的字节数组放入object数组中
bytes.SetValue(str_r, i);
}
return bytes;
}
private
string stxt()
{
Encoding gb = Encoding.GetEncoding("gb2312");
//调用函数产生4个随机中文汉字编码
object[] bytes = CreateRegionCode(3);
//根据汉字编码的字节数组解码出中文汉字
string str1 = gb.GetString((byte[])Convert.ChangeType(bytes[0],
typeof(byte[])));
string str2 = gb.GetString((byte[])Convert.ChangeType(bytes[1],
typeof(byte[])));
string str3 = gb.GetString((byte[])Convert.ChangeType(bytes[2],
typeof(byte[])));
string txt = str1 + str2 + str3;
return txt;
}
这样我们在该页面的load事件里调用这个方法就可以了
private
readonly string ImagePath = "Validator.jpg";
private
static string gif = "";
protected
void Page_Load(object sender, EventArgs e)
{
gif = stxt();
///创建Bmp位图
Bitmap bitMapImage = new
System.Drawing.Bitmap(Server.MapPath(ImagePath));
Graphics graphicImage = Graphics.FromImage(bitMapImage);
///设置画笔的输出模式
graphicImage.SmoothingMode = SmoothingMode.HighSpeed;
///添加文本字符串
graphicImage.DrawString(gif, new Font("Georgia", 20,
FontStyle.Bold), SystemBrushes.WindowText, new Point(5, 5));
///设置图像输出的格式
Response.ContentType = "image/jpeg";
///保存数据流
bitMapImage.Save(Response.OutputStream, ImageFormat.Jpeg);
///释放占用的资源
graphicImage.Dispose();
bitMapImage.Dispose();
}