你好,游客 登录 注册 搜索
背景:
阅读新闻

代码段之验证码 -

[日期:2013-03-28] 来源:  作者: [字体: ]

使用一般处理程序输出带噪音线的验证码图片绑定前台图片控件

<% @ WebHandler Language="C#" Class="ValidateCode" %>
using System;
using System.Web;
using System.Drawing;
using System.Web.SessionState;
public class ValidateCode : IHttpHandler, IRequiresSessionState {
    HttpContext context;
    public void ProcessRequest(HttpContext context1) {
        this.context = context1;
        CreateCheckCodeImage(GenerateCheckCode());
    }
    private string GenerateCheckCode() {
        int number;
        char code;
        string checkCode = String .Empty;
        System. Random random new Random();
        for(int i = 0; i < 5; i++) {
            number = random.Next();
            if(number % 2 == 0)
                code = ( char)('0' + (char)(number % 10));
            else
                code = ( char)('A' + (char)(number % 26));
            checkCode += code.ToString();
        }
        //需要将验证码同时加入Cookie或Session中 用于后续验证 防止暴力注册
        //Response.Cookies.Add(new HttpCookie("CheckCode", checkCode));
        context.Session.Add( "vCode", checkCode);
        return checkCode;
    }
    private void CreateCheckCodeImage(string checkCode) {
        if(checkCode == null || checkCode.Trim() == String.Empty)
            return;
        System.Drawing. Bitmap image new System.Drawing.Bitmap((int )Math.Ceiling((checkCode.Length * 12.5)), 22);
        Graphics g = Graphics .FromImage(image);
        try {
            //生成随机生成器
            Random random = new Random();
            //清空图片背景色
            g.Clear( Color.White);
            //画图片的背景噪音线
            for(int i = 0; i < 25; i++) {
                int x1 = random.Next(image.Width);
                int x2 = random.Next(image.Width);
                int y1 = random.Next(image.Height);
                int y2 = random.Next(image.Height);
                g.DrawLine( new Pen (Color.Silver), x1, y1, x2, y2);
            }
            Font font new System.Drawing.Font( "Arial", 12, (System.Drawing.FontStyle.Bold | System.Drawing.FontStyle .Italic));
            System.Drawing.Drawing2D. LinearGradientBrush brush new System.Drawing.Drawing2D.LinearGradientBrush (new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color .DarkRed, 1.2ftrue);
            g.DrawString(checkCode, font, brush, 2, 2);
            //画图片的前景噪音点
            for(int i = 0; i < 100; i++) {
                int x = random.Next(image.Width);
                int y = random.Next(image.Height);
                image.SetPixel(x, y, Color.FromArgb(random.Next()));
            }
            //画图片的边框线
            g.DrawRectangle( new Pen (Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
            System.IO. MemoryStream ms new System.IO.MemoryStream();
            image.Save(ms, System.Drawing.Imaging. ImageFormat.Gif);
            context.Response.ClearContent();
            context.Response.ContentType "image/Gif";
            context.Response.BinaryWrite(ms.ToArray());
        } finally {
            g.Dispose();
            image.Dispose();
        }
    }
    public bool IsReusable {
        get {
            return false ;
        }
    }
}

调用部分

<tr>
     <td width="24%" height="26" align="center" valign="top">
         验证码:
     </td>
     <td valign="top" width="37%" align="left">
         <asp: TextBox ID ="txtVCode" runat="server"></asp :TextBox>
             <asp: RequiredFieldValidator ID="RequiredFieldValidator8" runat="server" ControlToValidate="txtLoginId"
                    Display="Dynamic" ErrorMessage="验证码不能为空!">*</ asp:RequiredFieldValidator >
                  <br />
              <img src="../ashx/ValidateCode.ashx" onclick="ChangeVCode(this)" />
     </td></tr>

使用js事件更换验证码

function ChangeVCode(img) {
            img.src = "../ashx/ValidateCode.ashx?" + new Date();
        }

后台页面对验证码的验证

if(Session["vCode" ] != null) {
                string vCode = Session["vCode" ].ToString();
                string userCode = txtVCode.Text.Trim();
                //一般情况下 验证码不区分大小写
                if(vCode.Equals(userCode, StringComparison .OrdinalIgnoreCase)) {
                    return true ;
                } else {
                    //.Net动态向前台页面插入JS脚本
                    //把js脚本输出到<Form>表单内 我们自己的控件前面(键,脚本,是否自动加<Script>标签)
                    Page.ClientScript.RegisterStartupScript( this.GetType(), "a" , "alert('验证码输入有误1');" , true);
                     //Page.ClientScript.RegisterStartupScript(this.GetType(), "a", "alert('页面类型与键与上述重复时 此alert不会弹出 即页面类型,键组合确认脚本唯一性');", true);
                                   //Page.ClientScript.RegisterStartupScript 和上面的方法类似,不同的是输出脚本在Form表单内容最后.如果JS需要操作页面控件,必须用这个方法
                    return false ;
                }

效果图如下:






收藏 推荐 打印 | 录入:admin | 阅读:
相关新闻