欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

asp.net下中文验证码,免费开源代码

程序员文章站 2023-11-11 20:45:10
using system; using system.data; using system.configuration; using ...
using system;
using system.data;
using system.configuration;
using system.collections;
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.text;
using system.drawing;

public partial class cncode : system.web.ui.page
{
protected void page_load(object sender, eventargs e)
{
//获取gb2312编码页(表) 
encoding gb = encoding.getencoding("gb2312");

//调用函数产生4个随机中文汉字编码 
object[] bytes = createregioncode(4);

//根据汉字编码的字节数组解码出中文汉字 
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 str4 = gb.getstring((byte[])convert.changetype(bytes[3], typeof(byte[])));

//输出的控制台 
createimage(str1 + str2 + str3 + str4);

}

/* 
此函数在汉字编码范围内随机创建含两个元素的十六进制字节数组,每个字节数组代表一个汉字,并将 
四个字节数组存储在object数组中。 
参数:strlength,代表需要产生的汉字个数 
*/
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]; 

/**//*每循环一次产生一个含两个元素的十六进制字节数组,并将其放入bject数组中 
每个汉字有四个区位码组成 
区位码第1位和区位码第2位作为字节数组第一个元素 
区位码第3位和区位码第4位作为字节数组第二个元素 
*/ 
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 void createimage(string checkcode)
{
int iwidth = (int)(checkcode.length * 25);
system.drawing.bitmap image = new system.drawing.bitmap(iwidth, 20);
graphics g = graphics.fromimage(image);
font f = new system.drawing.font("arial", 12, system.drawing.fontstyle.bold);
brush b = new system.drawing.solidbrush(color.white);
//g.fillrectangle(new system.drawing.solidbrush(color.blue),0,0,image.width, image.height);
g.clear(color.blue);
g.drawstring(checkcode, f, b, 3, 3);

pen blackpen = new pen(color.black, 0);
random rand = new random();
for (int i = 0; i < 4; i++)
{
int y = rand.next(image.height);
g.drawline(blackpen, 0, y, image.width, y);
}

system.io.memorystream ms = new system.io.memorystream();
image.save(ms, system.drawing.imaging.imageformat.jpeg);
response.clearcontent();
response.contenttype = "image/png";
response.binarywrite(ms.toarray());
g.dispose();
image.dispose();
}



该文章转载自'大智の博客':http://www.csafe.cn/article.asp?id=1274