ASP.NET中英文混合特效服务端验证控件Validation Code Generator(VCG) 全部源码下载地址(微软学生社区):http://www.mscenter.edu.cn/prj/files/1232/VCG.rar 功能介绍: 为网页编程人员提供能够自动生成验证码图像并验证网页访问者输入的Web控件,具体功能如下:1. 提供简单易用的设计时所见即所得的可视化设置方式,并且支持设计时验证码图像效果与特效属性设置的实时联动体现,极大地提高程序员的工作效率;2. 对验证码图像的包括残影、打散、风化、旋转、斜变等多种图形学图像处理特效以及对各种特效的三个程度等级的灵活控制能力,让程序员在轻松应对基于OCR的恶意识别攻击的情况下,还能有充分的余地考虑验证码图像外观的美化问题;3. 提供灵活的中文诗词、中文单字、英文大小写字母、阿拉伯数字等丰富的验证码生成字源混合控制以及对于字数和字体的自定义控制,让程序员在面对不同客户以及网页访问者的特殊要求的同时仍能从容兼顾良好的用户体验;4. 保留对抗OCR的经典的点、线干扰特效以及三个程度等级的灵活控制,并采用色调匹配技术在保证原有的OCR对抗效果的同时加入了更加美观的彩色点、线效果,留给程序员更多的选择;5. 无刷新页面验证。更好地适用于需要填写大量信息的页面验证,有效地避免由于因突发性网络原因导致的验证码图像的无法下载,而使网页用户必须刷新页面而重填其它信息的窘境。运行环境:1. Microsoft Windows XP Professional2. Microsoft Visual Studio 20053. Microsoft .NET Framework V2.04. Microsoft Internet Information Services (IIS) V5.1(注意在子安装选项中选中FrontPage 2000服务器扩展)常见问答:1. 如何将本控件添加到Microsoft Visual Studio 2005的IDE中?a) 在Microsoft Visual Studio 2005中打开源代码的工程文件,重新编译,生成vcg.dll;b) 在工具箱(Toolbox)面板上单击右键,选择Choose Items…菜单,在弹出来的Choose ToolBox Items属性面板中,点击Browse…找到并选定vcg.dll控件。该控件即被添加到工具箱;2. 如何使用本控件?a) 确认需要添加本控件的网页为aspx页面。在IIS管理器中将网站属性的ASP.NET version选中为2.0,并在网站虚拟目录属性的“安全”选项卡中添加ASP.NET用户,赋予写入权限;b) 在Microsoft Visual Studio 2005中打开相应的网站,并打开相应的aspx页面文件(在本文中以Default.aspx为例),进入Design编辑模式;c) 从工具箱将之前添加的vcg控件拖到Default.aspx页面上。此时页面上的拖放位置应该出现一个带有文字内容的图片框,说明vcg控件已经被正确添加到页面;d) 现在可以像修改其它标准控件一样通过鼠标对控件进行拖动、缩放等修改,还可以在属性栏对控件进行进一步的细节设置。主要包括针对验证码图像的特效控制和针对验证码本身的文字控制两个方面。具体内容请参考本控件的使用手册;e) 在Default.aspx中新增Web控件Button:btnValidate,作为验证促发;在Default.aspx中新增Web控件TextBox:textCode,作为验证码输入;在Default.aspx中新增Web控件Lable:lblMessage,作为验证结果输出;f) 在Default.aspx.cs中添加验证函数:protected void btnValidate_Click(object sender, EventArgs e){ string code = “”; try { //真正的验证码存储在Session[“Code”]中,需要的只是对验证码输入和该值进行比较。 //(如果属性栏中“文字控制”属性卡下的“SessionCode”默认属性值“Code”改变, //则在代码中的Session[”Code”]中引号内的值也必须手工修改成与属性值一致的字符串。) code = Session[”Code”].ToString(); } catch (Exception ex) { throw new Exception(ex.ToString()); } if (textCode.Text == code) lblMessage.Text = “u got it.”; else lblMessage.Text = “u lost it.”;}g) 测试验证功能。浏览default.aspx页面,在TextBox中输入正确的码字,点击“验证”按钮。然后vcg控件返回新验证图,同时标签lblMessage给出成功的验证结果信息—“u got it.”;输入错误的验证码并点击“验证”按钮,标签lblMessage给出失败的验证结果—“u lost it.”。3. 如何实现无刷新页面验证?a) 在Source模式下的Default.aspx文件中添加html控件Button,作为刷新促发:<input type=”button” value=”ReFresh” οnclick=”VcgReFresh();” style=”height: 24px;width:90px” />然后在Design模式下即可看见刷新按钮;b) 在Default.aspx文件首部添加脚本:<script language=”javascript”> function VcgReFresh() { var message = ‘tirestay:’; var context = “; <%=CallBack%> } function ShowImage(VcgMessage, context) { document.images[’Vcg1’].src=VcgMessage; } function OnError(message, context) { alert(‘An unhandled exception has occurred:/n’ + message); }</script>由于控件继承自Image,在ShowImage()中使用document.images[’Vcg1’]来找到控件。c) 在Default.aspx.cs中添加回调protected string CallBack;protected void Page_Load(object sender, EventArgs e){ CallBack = this.ClientScript.GetCallbackEventReference(Vcg1, “message”, “ShowImage”, “context”, “OnError”, true);}d) 重新编译网站,浏览Default.aspx页面,点击Refresh按钮就可以单独刷新vcg控件的验证码图像,而不会刷新整个页面。源码说明:vcg工程源代码中大体上分为四部分:文字生成、图像处理、控制中心和UI。从源代码文件(实际上也对应于类)来看,文字生成部分对应iGbGen.cs;图像处理部分包括iPicGen.cs、iPicManage.cs以及Image_Manage.cs;控制中心对应iControlCenter.cs;UI包括iDesign.cs和vcg.cs。下面简要说明各个类的功能及关键代码。1. iGbGen类:根据控制参数生成随机验证码串。//解析控制参数public string giveString(int[] control) {Save_chartxt();if (control[2] == 1) { Use_Chartxt = true; }else Use_Chartxt = false;if (control[3] == 1) { Use_Poemtxt = true; }else Use_Poemtxt = false;if (control[4] == 1) { Use_num = true; }else Use_num = false;if (control[5] == 1) { Use_ABC = true; }else Use_ABC = false;if (control[6] == 1) { Use_abc = true; } else Use_abc = false; if (control[1] >= control[0] && control[1] < 9 && control[0] > 0) Generate_control(control[1], control[0]); if (Pick_result != null) return Pick_result; else return “字库参数设定有误”; } //生成随机验证码串private void Generate_control(int max_charnum, int min_charnum) { if (4 >= min_charnum && 4 <= max_charnum) poem_available = true; if (5 >= min_charnum && 5 <= max_charnum) poem_available = true; if (6 >= min_charnum && 6 <= max_charnum) poem_available = true; if (7 >= min_charnum && 7 <= max_charnum) poem_available = true; Single_char_counter = 0; int charnum = random.Next(max_charnum - min_charnum + 1) + min_charnum;//从用户指定字数范围中随机确定一值 int loop;//如果用户要使用某字库,就将它加入到single_char字库中待随机选if (Use_ABC)for (loop = 0; loop < Cap_Eng.Length; loop++) { Single_char[Single_char_counter] = Cap_Eng[loop]; Single_char_counter++; } if (Use_abc) for (loop = 0; loop < normal_Eng.Length; loop++) { Single_char[Single_char_counter] = normal_Eng[loop]; Single_char_counter++; } if (Use_num) for (loop = 0; loop < num.Length; loop++) { Single_char[Single_char_counter] = num[loop]; Single_char_counter++; } if (Use_Chartxt) { for (loop = 0; loop < char_txt_counter; loop++) { Single_char[Single_char_counter] = char_txt[loop].ToString(); Single_char_counter++; } } if (Use_ABC == false && Use_Chartxt == false && Use_abc == false && Use_num == false) { if (poem_available) {Pick_result = Pick_poem(charnum);while (Pick_result == null) { charnum = random.Next(max_charnum - min_charnum + 1) + min_charnum; Pick_result = Pick_poem(charnum); } } else Pick_result = “字库范围设定错误”; } else { if (Use_Poemtxt) { if (poem_available) { if (random.Next(2) == 1) {Pick_result = Pick_poem(charnum);while (Pick_result == null) { charnum = random.Next(max_charnum - min_charnum + 1) + min_charnum; Pick_result = Pick_poem(charnum); } } else Pick_Single_char(charnum); } else Pick_Single_char(charnum); } else Pick_Single_char(charnum); } } 2. iPicGen类:根据字符和控制参数生成单个字符的初始图像并完成除加点、加线之外的所有特效处理。 public System.Drawing.Bitmap retrieveOne(THECHAR theChar, int[] pArguments) { System.Drawing.Bitmap picTemp = Manage.ChangeCode(theChar.Word_Char.ToString()/*文字*/, theChar.Font_Char/*字体*/, new SolidBrush(theChar.Color_Char)/*字体颜色*/); picTemp = Manage.Rotate(picTemp, pArguments[0]); //对图像进行旋转处理 picTemp = Manage.RotateTwist(picTemp, pArguments[1]); //对图像产生旋转扭曲 picTemp = Manage.Incline(picTemp, pArguments[2]); //对图像进行斜变处理 picTemp = Manage.Scatter(picTemp, pArguments[3]); //对图像进行打散处理 picTemp = Manage.Shadow(picTemp, pArguments[4]); //对图像进行残影处理 picTemp = Manage.Coordinate(picTemp, pArguments[5]); //对图像产生极坐标变换 picTemp = Manage.LineTwist(picTemp, pArguments[6]); //对图像产生线性扭曲 picTemp = Manage.Decency(picTemp, pArguments[7]); //对图像进行风化处理 picTemp = Manage.Confuse(picTemp, pArguments[8]); //对图像进行模糊处理 picTemp = Manage.Mosaic(picTemp, pArguments[9]); //对图像进行马赛克处理 picTemp = Manage.SmallorLarge(picTemp, pArguments[10]); //对图像进行缩放处理 return picTemp; //返回生成的图像 } 3. iPicManage类:完成最终验证码图像的特效处理,包括贴字和加点加线等。 public System.Drawing.Bitmap retrieveFinal() {int x = 3;int y = 3; System.Drawing.Bitmap Word_picBoard = new System.Drawing.Bitmap(picBoard); ///创建字符串Bitmap对象Word_picBoard picBoard = Manage.AddBackGround(picBoard, System.Drawing.Color.White , x, y);//加入背景 picBoard = Manage.RedomSpot(picBoard, mArguments[1]);//加入随机点picBoard = Manage.RedomLine(picBoard, mArguments[2]);//加入随机线System.Drawing.Graphics Graphics_picBoard = System.Drawing.Graphics.FromImage(picBoard); //创建picBoard的Graphics对象Graphics_picBoard Graphics_picBoard.DrawImage(Word_picBoard, x, y); //绘制字符串 picBoard = Manage.SmallorLarge(picBoard, (float)(mArguments[0]) / picBoard.Height + 1, (float)(mArguments[0]) / picBoard.Height + 1); return picBoard; //返回生成的图像 } 4. Image_Manage类:实现对单字图像的具体特效处理方法。是本控件的核心。具体内容请直接参考源代码,在此不再赘述。5. iControlCenter类:根据参数协调有关的类生成所需的验证码字和最终的验证图像。//解析参数public void DistriArgs(int[] arg,THECHAR tc) {//arguments for iGbgenif (arg[4] <= arg[5] && arg[4] > 0 && arg[5] < 9) {gArguments[0] = arg[4];gArguments[1] = arg[5]; } for (int i = 6; i < 11; i++) { if ((arg[i] == 0) || (arg[i] == 1)) gArguments[i - 4] = arg[i]; } //arguments for iPicGenfor (int i = 13; i < 24; i++) { if (arg[i] > 0 && arg[i] < 4) pArguments[i - 13] = arg[i]; } //arguments for iPicManagemArguments[1] = arg[1];mArguments[2] = arg[2];//UNFINISHED PART, mArguments[0]=y_hight!!!mArguments[0]=arg[0];mArguments[3]=0; this.workflow(tc); } //控制生成从验证码字到最终图像的完整流程public void workflow(THECHAR tc) {iPicManage ipm=new iPicManage(mArguments);iPicGen ipg=new iPicGen ();iGbGen gb = new iGbGen();theString = gb.giveString(gArguments);//seperatestheChars = theString.ToCharArray();thecharnotdone.Color_Char = tc.Color_Char;thecharnotdone.Font_Char = tc.Font_Char;for(int i=0;i<theString.Length;i++) { thecharnotdone.Word_Char = theChars[i];aPic=ipg.retrieveOne(thecharnotdone,pArguments); ipm.pasteOne(aPic); } finalPic=ipm.retrieveFinal(); } 6. iDesign类:继承自设计时控制器ControlDesigner。 class iDesign : ControlDesigner {bool bGetDesignTimeHtmlCalled = false;vcg ctrl; public override string GetDesignTimeHtml() { if (!bGetDesignTimeHtmlCalled) {ctrl = (vcg)Component;bGetDesignTimeHtmlCalled = true; }string directory = System.IO.Directory.GetCurrentDirectory();directory += @”/buptunited”+ctrl.GetFileAppend(ctrl.图片格式);ctrl.Generate(directory); return “<img src=’”+ directory +”’ width=’” + ctrl.IWidth + “’ height=’” + ctrl.IHeight + “’>”; } } 7. vcg类:控件UI。主要包括设计时属性的控制与后端代码的协调以及运行时的一些变量存储问题。属性包括:文字控制、特效控制、特效模板、综合控制共四块,具体内容请直接参考源代码。此外还包括一个顶层的完整验证码图像生成流程,利用Session存储后端生成的验证码字。 public void Generate(string fileUrl) {//验证码显示的文字属性userArgueList[0] = (int)this.IHeight.Value;THECHAR tc = new THECHAR();tc.Color_Char = Color.Black;tc.Font_Char = new Font(字体.ToString(), userArgueList[0], FontStyle.Regular); //把参数组传进控制器iControlCenter icc = new iControlCenter();icc.DistriArgs(userArgueList, tc); //取得验证码string code = icc.getString;try { if (Page.Session[SessionCode] == null) Page.Session.Add(SessionCode, code); else Page.Session[SessionCode] = code; } catch (Exception) { //throw new Exception(“session error!”); } //由验证码得到图片Bitmap pBitmap = icc.getPic;switch (图片格式) { case graphicType.Jpeg:pBitmap.Save(fileUrl, ImageFormat.Jpeg);break; case graphicType.Gif:pBitmap.Save(fileUrl, ImageFormat.Gif);break; case graphicType.Png:pBitmap.Save(fileUrl, ImageFormat.Png);break; case graphicType.Bmp:pBitmap.Save(fileUrl, ImageFormat.Bmp);break; default:pBitmap.Save(fileUrl, ImageFormat.Jpeg);break; } pBitmap.Dispose(); } 作者声明:1. 北京邮电大学微软俱乐部BUPTUNITED团队是本控件的开发者和所有者;2. 北京邮电大学微软俱乐部BUPTUNITED团队发布本控件源代码及相关文档作为共享资源。使用者对本控件源代码及相关文档的使用是免费的,但引用时必须注明出处;3. 北京邮电大学微软俱乐部BUPTUNITED团队并不保证本控件源代码及相关文档不会引起使用者任何形式的损失,也不对这种损失承担任何责任; 北京邮电大学微软俱乐部BUPTUNITED团队