• 技术文章 >后端开发 >C#.Net教程

    asp.net 验证码生成和刷新及验证

    高洛峰高洛峰2017-01-13 13:57:45原创889
    验证码技术是为了防止暴力破解等而设定的。现在一般的网站注册等都提供验证码功能,特别是腾讯更是长长的一串。文中参考了别人的代码。有了就没有必要再写了。可以读一下。不过我测试时发现了两次PageLoad的问题。注释了两句即可。同时修改了namespaces。同时提供完整的验证说明:
    1 新建VerifyCode.aspx
    cs文件代码如下:

    using System; 
    using System.Collections; 
    using System.ComponentModel; 
    using System.Data; 
    using System.Web; 
    using System.Web.SessionState; 
    using System.Web.UI; 
    using System.Web.UI.WebControls; 
    using System.Web.UI.HtmlControls; 
    using System.Drawing; 
    using System.Drawing.Imaging; 
    using System.Drawing.Text; 
    /**///// <summary> 
    /// 页面验证码程序 
    /// 使用:在页面中加入HTML代码 <img src="VerifyCode.aspx"> 
    /// </summary> 
    public partial class VerifyCode : System.Web.UI.Page 
    ...{ 
    static string[] FontItems = new string[] ...{ "Arial", 
    "Helvetica", 
    "Geneva", 
    "sans-serif", 
    "Verdana" 
    }; 
    static Brush[] BrushItems = new Brush[] ...{ Brushes.OliveDrab, 
    Brushes.ForestGreen, 
    Brushes.DarkCyan, 
    Brushes.LightSlateGray, 
    Brushes.RoyalBlue, 
    Brushes.SlateBlue, 
    Brushes.DarkViolet, 
    Brushes.MediumVioletRed, 
    Brushes.IndianRed, 
    Brushes.Firebrick, 
    Brushes.Chocolate, 
    Brushes.Peru, 
    Brushes.Goldenrod 
    }; 
    static string[] BrushName = new string[] ...{ "OliveDrab", 
    "ForestGreen", 
    "DarkCyan", 
    "LightSlateGray", 
    "RoyalBlue", 
    "SlateBlue", 
    "DarkViolet", 
    "MediumVioletRed", 
    "IndianRed", 
    "Firebrick", 
    "Chocolate", 
    "Peru", 
    "Goldenrod" 
    }; 
    private static Color BackColor = Color.White; 
    private static Pen BorderColor = Pens.DarkGray; 
    private static int Width = 52; 
    private static int Height = 21; 
    private Random _random; 
    private string _code; 
    private int _brushNameIndex; 
    override protected void OnInit(EventArgs e) 
    ...{ 
    // 
    // CODEGEN: This call is required by the ASP.NET Web Form Designer. 
    // 
    //InitializeComponent(); 
    //base.OnInit(e); 
    } 
    /**//**//**//// <summary> 
    /// Required method for Designer support - do not modify 
    /// the contents of this method with the code editor. 
    /// </summary> 
    private void InitializeComponent() 
    ...{ 
    //this.Load += new System.EventHandler(this.Page_Load); 
    } 
    /**//// <summary> 
    /// 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="e"></param> 
    public void Page_Load(object sender, System.EventArgs e) 
    ...{ 
    if (!IsPostBack) 
    ...{ 
    // 
    // TODO : initialize 
    // 
    this._random = new Random(); 
    this._code = GetRandomCode(); 
    // 
    // TODO : use Session["code"] save the VerifyCode 
    // 
    Session["code"] = this._code; 
    // 
    // TODO : output Image 
    // 
    this.SetPageNoCache(); 
    this.OnPaint(); 
    } 
    } 
    /**//**//**//// <summary> 
    /// 设置页面不被缓存 
    /// </summary> 
    private void SetPageNoCache() 
    ...{ 
    Response.Buffer = true; 
    Response.ExpiresAbsolute = System.DateTime.Now.AddSeconds(-1); 
    Response.Expires = 0; 
    Response.CacheControl = "no-cache"; 
    Response.AppendHeader("Pragma","No-Cache"); 
    } 
    /**//**//**//// <summary> 
    /// 取得一个 4 位的随机码 
    /// </summary> 
    /// <returns></returns> 
    private string GetRandomCode() 
    ...{ 
    return Guid.NewGuid().ToString().Substring(0, 4); 
    } 
    /**//**//**//// <summary> 
    /// 随机取一个字体 
    /// </summary> 
    /// <returns></returns> 
    private Font GetFont() 
    ...{ 
    int fontIndex = _random.Next(0, FontItems.Length); 
    FontStyle fontStyle = GetFontStyle(_random.Next(0, 2)); 
    return new Font(FontItems[fontIndex], 12, fontStyle); 
    } 
    /**//**//**//// <summary> 
    /// 取一个字体的样式 
    /// </summary> 
    /// <param name="index"></param> 
    /// <returns></returns> 
    private FontStyle GetFontStyle(int index) 
    ...{ 
    switch (index) 
    ...{ 
    case 0: 
    return FontStyle.Bold; 
    case 1: 
    return FontStyle.Italic; 
    default: 
    return FontStyle.Regular; 
    } 
    } 
    /**//**//**//// <summary> 
    /// 随机取一个笔刷 
    /// </summary> 
    /// <returns></returns> 
    private Brush GetBrush() 
    ...{ 
    int brushIndex = _random.Next(0, BrushItems.Length); 
    _brushNameIndex = brushIndex; 
    return BrushItems[brushIndex]; 
    } 
    /**//**//**//// <summary> 
    /// 绘画事件 
    /// </summary> 
    private void OnPaint() 
    ...{ 
    Bitmap objBitmap = null; 
    Graphics g = null; 
    try 
    ...{ 
    objBitmap = new Bitmap(Width, Height); 
    g = Graphics.FromImage(objBitmap); 
    Paint_Background(g); 
    Paint_Text(g); 
    Paint_TextStain(objBitmap); 
    Paint_Border(g); 
    objBitmap.Save(Response.OutputStream, ImageFormat.Gif); 
    Response.ContentType = "image/gif"; 
    } 
    catch ...{} 
    finally 
    ...{ 
    if (null != objBitmap) 
    objBitmap.Dispose(); 
    if (null != g) 
    g.Dispose(); 
    } 
    } 
    /**//**//**//// <summary> 
    /// 绘画背景颜色 
    /// </summary> 
    /// <param name="g"></param> 
    private void Paint_Background(Graphics g) 
    ...{ 
    g.Clear(BackColor); 
    } 
    /**//**//**//// <summary> 
    /// 绘画边框 
    /// </summary> 
    /// <param name="g"></param> 
    private void Paint_Border(Graphics g) 
    ...{ 
    g.DrawRectangle(BorderColor, 0, 0, Width - 1, Height - 1); 
    } 
    /**//**//**//// <summary> 
    /// 绘画文字 
    /// </summary> 
    /// <param name="g"></param> 
    private void Paint_Text(Graphics g) 
    ...{ 
    g.DrawString(_code, GetFont(), GetBrush(), 3, 1); 
    } 
    /**//**//**//// <summary> 
    /// 绘画文字噪音点 
    /// </summary> 
    /// <param name="g"></param> 
    private void Paint_TextStain(Bitmap b) 
    ...{ 
    for (int n=0; n<30; n++) 
    ...{ 
    int x = _random.Next(Width); 
    int y = _random.Next(Height); 
    b.SetPixel(x, y, Color.FromName(BrushName[_brushNameIndex])); 
    } 
    } 
    }

    2 页面引用:
    <asp:Image ID="getcode" src="VerifyCode.aspx" runat="server" />
    一般需要同时提供刷新功能(看不清楚换一张),代码如下
    <asp:Image ID="getcode" src="VerifyCode.aspx" runat="server" /> <A href="javascript:getimgcode()">刷新验证码</A>
    如使用了母版页,则用如下代码:
    <img ID="getcode" alt="" src="VerifyCode.aspx" /> <%--<asp:Image ID="getcode" src="VerifyCode.aspx" runat="server" />--%>
    <A href="javascript:getimgcode()">刷新验证码</A>
    超链接对应的javascript如下:
    <script language="javascript" type="text/javascript">
    function getimgcode()
    {
    var getimagecode = document.getElementById("getcode");
    getimagecode.src = "VerifyCode.aspx";
    }
    </script>
    3 判断验证
    上述代码是将验证码存贮在Session中,用code来标志。读取代码Session["code"].ToString();
    使用中,我们只需要比较Session["code"].ToString()和文本框输入的串(TextBoxCode.Text)是否相同即可进行判断。
    if(Session["code"].ToString().Trim().Equals(TextBoxCode.Text.Trim()))
    ...{
    Response.Write("Success");
    }
    测试通过!

    更多asp.net 验证码生成和刷新及验证相关文章请关注PHP中文网!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:asp.net 验证码
    上一篇:asp.net点选验证码实现思路 下一篇:asp.net 图片验证码的HtmlHelper
    Web大前端开发直播班

    相关文章推荐

    • 一文聊聊C语言中的字符串操作(大小写转换、比较、排序等)• 分享一道逻辑面试题,看看你能答对吗!• C#数组学习• SUNWEN教程之----C#进阶(三)• .NET异步编程总结----四种实现模式代码总结
    1/1

    PHP中文网