`

验证码的三种做法[纯数字][纯汉字][字母\数字\汉字混合]C#

阅读更多

网上有很多关于验证码做法的资料,但是真正做得完整的却非常少,所以昨天晚上参考了作者:CSDN 上kwklover 的在ASP.NET下实现数字和字符相混合的验证码 (混合,完整,遗憾的是vb.net,说到这里我想我得感谢stone(QQ9337874),因为我在把VB译成C#的过程中几番出错,最终这段翻译由他完成)!!

随机汉字参考了http://navicy.cnblogs.com/archive/2005/05/08/150756.html这篇文章的,

而最终的纯数字以及GDI+绘图则是从□☆近三十☆(QQ19302038)传给我的一个OA案例里面分离出来的!

所以完整的说,这里面几乎都是别人做好了的,我只是整理出来了!

完整的下载地址是 http://www.cnblogs.com/Files/thcjp/gdi.rar 

下面把代码的重点部分贴出来,如果看源文件有什么不明白可以问偶 QQ110535808

效果如图(我确实懒了点,按纽的名字都没有改,哈哈)
需要说明的是,因为提交对比后,页面是重新刷新了,所以文本框里面看见的和后面图片显示不一样,这个不需要太多说明吧!!

混合模式刷新出现约界错误 已经被 stone(QQ9337874) 修正!!


下面是GDI+绘图的代码段,以及显示的调用等
usingSystem;
usingSystem.Data;
usingSystem.Configuration;
usingSystem.Collections;
usingSystem.Web;
usingSystem.Web.Security;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.WebControls.WebParts;
usingSystem.Web.UI.HtmlControls;
usingSystem.Drawing.Drawing2D;
usingSystem.Drawing.Imaging;
usingSystem.Drawing.Text;
usingSystem.Drawing;
usingSystem.Text;

publicpartialclasspng:System.Web.UI.Page
{
privatereadonlystringImagePath="Validator.jpg";
privatestaticstringgif="";

protectedvoidPage_Load(objectsender,EventArgse)
{

switch(Request.QueryString["aa"])
{
case"1":
gif
=stxt();
Session[
"gif"]=stxt();
break;
case"2":
gif
=GetRandomint();
Session[
"gif"]=GetRandomint();
break;
case"3":
gif
=RndNum(3);
Session[
"gif"]=RndNum(3);
break;
default:
gif
=RndNum(3);
Session[
"gif"]=GetRandomint();
break;
}


/**////创建Bmp位图
BitmapbitMapImage=newSystem.Drawing.Bitmap(Server.MapPath(ImagePath));
GraphicsgraphicImage
=Graphics.FromImage(bitMapImage);

/**////设置画笔的输出模式
graphicImage.SmoothingMode=SmoothingMode.HighSpeed;
/**////添加文本字符串
graphicImage.DrawString(gif,newFont("Arial",20,FontStyle.Bold),SystemBrushes.WindowText,newPoint(0,0));

/**////设置图像输出的格式
Response.ContentType="image/jpeg";

/**////保存数据流
bitMapImage.Save(Response.OutputStream,ImageFormat.Jpeg);

/**////释放占用的资源
graphicImage.Dispose();
bitMapImage.Dispose();
}

返回纯数字

privateStringGetRandomint()
{
Randomrandom
=newRandom();
return(random.Next(100000,999999).ToString());
}


返回文字\数字\字母混合的

publicstaticStringRndNum(intVcodeNum)
{
StringVchar
="0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,W,X,Y,Z,呵,哈,弹,簧,秤,嬉,戏";
String[]VcArray
=Vchar.Split(',');
StringVNum
="";
Randomrandom
=newRandom();
for(inti=1;i<=VcodeNum;i++)
{
intiNum=0;
while((iNum=Convert.ToInt32(VcArray.Length*random.NextDouble()))==VcArray.Length)
{
iNum
=Convert.ToInt32(VcArray.Length*random.NextDouble());
}

VNum
+=VcArray[iNum];
//VNum+=VcArray[Convert.ToInt32(VcArray.Length*random.NextDouble())];
}

returnVNum;
}

返回汉字的
publicstaticobject[]CreateRegionCode(intstrlength)
{
//定义一个字符串数组储存汉字编码的组成元素
string[]rBase=newString[16]{"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"};

Randomrnd
=newRandom();

//定义一个object数组用来
object[]bytes=newobject[strlength];

/**//**//**//*每循环一次产生一个含两个元素的十六进制字节数组,并将其放入bject数组中
每个汉字有四个区位码组成
区位码第1位和区位码第2位作为字节数组第一个元素
区位码第3位和区位码第4位作为字节数组第二个元素
*/

for(inti=0;i<strlength;i++)
{
//区位码第1位
intr1=rnd.Next(11,14);
stringstr_r1=rBase[r1].Trim();

//区位码第2位
rnd=newRandom(r1*unchecked((int)DateTime.Now.Ticks)+i);//更换随机数发生器的种子避免产生重复值
intr2;
if(r1==13)
{
r2
=rnd.Next(0,7);
}

else
{
r2
=rnd.Next(0,16);
}

stringstr_r2=rBase[r2].Trim();

//区位码第3位
rnd=newRandom(r2*unchecked((int)DateTime.Now.Ticks)+i);
intr3=rnd.Next(10,16);
stringstr_r3=rBase[r3].Trim();

//区位码第4位
rnd=newRandom(r3*unchecked((int)DateTime.Now.Ticks)+i);
intr4;
if(r3==10)
{
r4
=rnd.Next(1,16);
}

elseif(r3==15)
{
r4
=rnd.Next(0,15);
}

else
{
r4
=rnd.Next(0,16);
}

stringstr_r4=rBase[r4].Trim();

//定义两个字节变量存储产生的随机汉字区位码
bytebyte1=Convert.ToByte(str_r1+str_r2,16);
bytebyte2=Convert.ToByte(str_r3+str_r4,16);
//将两个字节变量存储在字节数组中
byte[]str_r=newbyte[]{byte1,byte2};

//将产生的一个汉字的字节数组放入object数组中
bytes.SetValue(str_r,i);

}


returnbytes;

}

privatestringstxt()
{
Encodinggb
=Encoding.GetEncoding("gb2312");

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

//根据汉字编码的字节数组解码出中文汉字
stringstr1=gb.GetString((byte[])Convert.ChangeType(bytes[0],typeof(byte[])));
stringstr2=gb.GetString((byte[])Convert.ChangeType(bytes[1],typeof(byte[])));
stringstr3=gb.GetString((byte[])Convert.ChangeType(bytes[2],typeof(byte[])));

stringtxt=str1+str2+str3;
returntxt;
}

我们调用页的代码如下

HTML代码
<%@PageLanguage="C#"AutoEventWireup="true"CodeFile="view.aspx.cs"Inherits="view"%>

<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<htmlxmlns="http://www.w3.org/1999/xhtml">
http://thcjp.cnblogs.com/Images/OutliningIndicators/No
分享到:
评论

相关推荐

    C#.NET验证码(数字,英文字母,汉字,混合)

    一个写法很简单,但是却很实用的c#验证码,vs2005编写。包含(数字,英文字母,汉字,混合)四种验证码格式,结合网上兄弟们的代码 写出来的。有需要的朋友可以参考下,个人感觉还可以。

    C# ASP.NET 模块 - 图文验证码模块

    ☆ 功能如下:☆ 纯数字验证码; 字母与数字混合验证码; 纯汉字验证码;

    字母\数字\汉字混合的验证码源码

    开发环境: VS2005 | 开发语言:C# 大小:16K

    .NET三种类型验证码实现

    .NET 生成验证码(数字+字母+中文+混合)

    仿Google混合扭曲验证码源码 ZHUImitationGoogleCode.rar

    仿Google混合扭曲验证码源码 源码描述: 一、源码特点 一款仿Google绘制成数字、字母和中文扭曲的验证码程序,感兴趣的欢迎下载 二、、注意事项 1、开发环境为Visual Studio 2010,使用.net 4.0开发。

    ASP.NET开发实战1200例(第Ⅰ卷)第二十章

    实例514 绘制纯数字的网站验证码 771 实例515 绘制数字与字母组合的验证码 772 实例516 绘制中文彩色验证码 774 实例517 仿Google绘制数字、字母和中文扭曲 验证码 776 实例518 在随机选中的图片上绘制混合验证码 ...

    vcg(验证码控件)

    提供灵活的中文诗词、中文单字、英文大小写字母、阿拉伯数字等丰富的验证码生成字源混合控制以及对于字数和字体的自定义控制,让程序员在面对不同客户以及网页访问者的特殊要求的同时仍能从容兼顾良好的用户体验;...

    C#基类库(苏飞版)

    取汉字拼音的首字母,只要你输入一个汉字,或者是多个汉字就会取出相应的道字母,主要是方便查询使用的 复制代码 16.配置文件操作类 ConfigHelper 1.根据Key取Value值 2.根据Key修改Value 3.添加新的Key ,Value...

    ASP.NET开发典型模块大全(C#)23到26章源码

     29.2.3 字母与数字混合验证码 640  29.2.4 纯汉字验证码 642  29.3 防盗链技术 644  29.3.1 盗链对网站的危害 644  29.3.2 防盗链的解决措施 645  29.3.3 图片资源防盗链下载 645  29.4 ...

Global site tag (gtag.js) - Google Analytics