<转>验证码 demo

From : http://blog.csdn.net/yi_zz/article/details/7869009


我们做一个登陆页面,来看看验证码的背后是怎么工作的:

 

  1. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Login_blog.aspx.cs" Inherits="WebApplication1.Login_blog" %>  
  2.   
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  4. <html xmlns="http://www.w3.org/1999/xhtml">  
  5. <head runat="server">  
  6.     <title>登陆验证码测试</title>  
  7.     <link href="css/Login_blog.css" rel="stylesheet" type="text/css" />  
  8. </head>  
  9. <body>  
  10.     <form id="form1" runat="server">  
  11.     <div>  
  12.         <h3>  
  13.             登录验证码测试  
  14.         </h3>  
  15.         <div id="Login_blog">  
  16.             <p>  
  17.                 用户名:  
  18.                 <asp:TextBox ID="txtUserName" runat="server" CssClass="textbox"></asp:TextBox>  
  19.                 <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ErrorMessage="请输入用户名"  
  20.                     Text="*" ControlToValidate="txtUserName"></asp:RequiredFieldValidator>  
  21.             </p>  
  22.             <p>  
  23.                 密码:  
  24.                 <asp:TextBox ID="txtPassword" runat="server" TextMode="Password" CssClass="textbox"></asp:TextBox>  
  25.                 <asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ErrorMessage="请输入密码!"  
  26.                     Text="*" ControlToValidate="txtPassword"></asp:RequiredFieldValidator>  
  27.             </p>  
  28.             <p>  
  29.                 验证码:<img src="../handler/WaterMark.ashx" id="vimg" alt="" onclick="changeCode()" />  
  30.                 <asp:TextBox ID="txtCode" runat="server" CssClass="txtCode"></asp:TextBox>  
  31.                 <asp:RequiredFieldValidator ID="RequiredFieldValidator3" runat="server" ErrorMessage="请输入验证码!"  
  32.                     Text="*" ControlToValidate="txtCode"></asp:RequiredFieldValidator>  
  33.             </p>  
  34.             <p>  
  35.                 <asp:Button ID="btnLogin" runat="server" Text="登录" OnClick="btnLogin_Click" />  
  36.             </p>  
  37.             <asp:ValidationSummary ID="ValidationSummary1" runat="server" ShowMessageBox="true"  
  38.                 ShowSummary="false" />  
  39.         </div>  
  40.     </div>  
  41.     </form>  
  42. </body>  
  43. </html>  


在Login_blog.aspx.cs里边这样

 

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Web;  
  5. using System.Web.UI;  
  6. using System.Web.UI.WebControls;  
  7. using BLL;  
  8. using System.Web.Security;  
  9.   
  10. namespace WebApplication1  
  11. {  
  12.     public partial class Login_blog : System.Web.UI.Page  
  13.     {  
  14.         protected void Page_Load(object sender, EventArgs e)  
  15.         {  
  16.   
  17.         }  
  18.         //登录按钮  
  19.         protected void btnLogin_Click(object sender, EventArgs e)  
  20.         {  
  21.             //判断验证码是否输入正确  
  22.             string code = txtCode.Text.Trim();  
  23.             string rightCode = Session["Code"].ToString();  
  24.             if (code!=rightCode)  
  25.             {  
  26.                 Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('验证码输入错误!');</script>");  
  27.                 return;  
  28.             }  
  29.             string name = txtUserName.Text.Trim();  
  30.             string pwd = txtPassword.Text.Trim();  
  31.   
  32.             bool b = LoginManager.Login(name, pwd);  
  33.             if (b)  
  34.             {  
  35.                 //登录成功  
  36.                 Session["admin"] = name;  
  37.                 Response.Redirect("http://blog.csdn.net/yi_zz");  
  38.             }  
  39.             else  
  40.             {  
  41.                     //登录失败  
  42.                 Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('登陆失败,用户名或者密码错误!');</script>");  
  43.             }  
  44.         }  
  45.           
  46.   
  47.     }  
  48. }  


css文件中我们排一下版:

 

  1. /* 
  2. *登陆验证码测试 
  3. */  
  4.   
  5.      *  
  6. {  
  7.     margin :0;  
  8.     padding :0;  
  9.     }  
  10. body   
  11. {  
  12.     font-size :14px;  
  13. }  
  14.  
  15.  
  16. #loginfrm #login p  
  17. {  
  18.     padding-bottom :10px;  
  19.     }  
  20. .textbox  
  21. {  
  22.     width :150px;  
  23.     }  
  24. .txtCode  
  25. {  
  26.     width :73px;  
  27.     }  


  1. /* 
  2.  * 创建人:宗毅    
  3.  * 创建时间:2012年8月11日19:38:27 
  4.  * 说明:登陆的业务逻辑类 
  5.  * 版权所有: 
  6. */  
  7. using System;  
  8. using System.Collections.Generic;  
  9. using System.Linq;  
  10. using System.Text;  
  11. namespace BLL  
  12. {  
  13.    public  class LoginManager  
  14.    {  
  15.        #region 用户登陆是否成功  
  16.        /// <summary>  
  17.        /// 用户登陆是否成功  
  18.        /// </summary>  
  19.        /// <param name="name">用户名</param>  
  20.        /// <param name="pwd">密码</param>  
  21.        /// <returns></returns>  
  22.        public static bool Login(string name, string pwd)  
  23.        {  
  24.            bool flag = false;  
  25.            if ("zongyi" == name && "czy" == pwd)  
  26.            {  
  27.                flag = true;  
  28.            }  
  29.            return flag;  
  30.        }  
  31.        #endregion  
  32.    }  
  33.       
  34. }  


最后看看验证码这部分的代码:

 

  1. /* 
  2.  * 验证码 
  3. */  
  4. using System;  
  5. using System.Web;  
  6. using System.Drawing;  
  7. using System.Drawing.Drawing2D;  
  8. using System.Web.SessionState;  
  9.   
  10. public class WaterMark : IHttpHandler, IRequiresSessionState  // 要使用session必须实现该接口,记得要导入System.Web.SessionState命名空间  
  11. {  
  12.   
  13.     public void ProcessRequest(HttpContext context)  
  14.     {  
  15.         string checkCode = GenCode(5);  // 产生5位随机字符  
  16.         context.Session["Code"] = checkCode; //将字符串保存到Session中,以便需要时进行验证  
  17.         System.Drawing.Bitmap image = new System.Drawing.Bitmap(70, 22);  
  18.         Graphics g = Graphics.FromImage(image);  
  19.         try  
  20.         {  
  21.             //生成随机生成器  
  22.             Random random = new Random();  
  23.   
  24.             //清空图片背景色  
  25.             g.Clear(Color.White);  
  26.   
  27.             // 画图片的背景噪音线  
  28.             int i;  
  29.             for (i = 0; i < 25; i++)  
  30.             {  
  31.                 int x1 = random.Next(image.Width);  
  32.                 int x2 = random.Next(image.Width);  
  33.                 int y1 = random.Next(image.Height);  
  34.                 int y2 = random.Next(image.Height);  
  35.                 g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);  
  36.             }  
  37.   
  38.             Font font = new System.Drawing.Font("Arial", 12, (System.Drawing.FontStyle.Bold));  
  39.             System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2F, true);  
  40.             g.DrawString(checkCode, font, brush, 2, 2);  
  41.   
  42.             //画图片的前景噪音点  
  43.             g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);  
  44.             System.IO.MemoryStream ms = new System.IO.MemoryStream();  
  45.             image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);  
  46.             context.Response.ClearContent();  
  47.             context.Response.ContentType = "image/Gif";  
  48.             context.Response.BinaryWrite(ms.ToArray());  
  49.         }  
  50.         finally  
  51.         {  
  52.             g.Dispose();  
  53.             image.Dispose();  
  54.         }  
  55.     }  
  56.   
  57.     /// <summary>  
  58.     /// 产生随机字符串  
  59.     /// </summary>  
  60.     /// <param name="num">随机出几个字符</param>  
  61.     /// <returns>随机出的字符串</returns>  
  62.     private string GenCode(int num)  
  63.     {  
  64.         string str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";  
  65.         char[] chastr = str.ToCharArray();  
  66.         string code = "";  
  67.         Random rd = new Random();  
  68.         int i;  
  69.         for (i = 0; i < num; i++)  
  70.         {  
  71.             //code += source[rd.Next(0, source.Length)];  
  72.             code += str.Substring(rd.Next(0, str.Length), 1);  
  73.         }  
  74.         return code;  
  75.   
  76.     }  
  77.   
  78.     public bool IsReusable  
  79.     {  
  80.         get  
  81.         {  
  82.             return false;  
  83.         }  
  84.     }  
  85.   
  86. }  


我们看到这个界面:

 

这个登录验证码的窗体已经算完成了,我们看的出来验证码其实就是通过一张图片,来区分用户和计算机,就能达到很好的防止:恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试;所以为了咱们的网络安全,这个验证码确实发挥了很大的作用。

posted on 2015-10-04 21:38  hahahahahai12  阅读(157)  评论(0)    收藏  举报

导航