• 数学运算表达式形式的验证码 C# Asp.Net


       /*---------------------------------------
         * Author: DeltaCat (三角猫)
         *
         * http://www.zu14.cn (真有意思网)
         *
         * Date: 2008/11/22
         *
         * 转载请保留此信息
         --------------------------------------*/


        /// <summary>
        /// 数学算式的验证码
        /// </summary>
        public sealed class MathVerifyCode
        {
            #region 生成图片

            /// <summary>
            /// 输出验证码表达式到浏览器
            /// </summary>
            /// <param name="context">httpcontext</param>
            /// <param name="sessionKey">保存运算值的SESSION的KEY</param>
            public void OutputImage(System.Web.HttpContext context, string sessionKey)
            {
                int mathResult = 0;
                string expression = null;

                Random rnd = new Random();

                ////生成3个10以内的整数,用来运算
                int operator1 = rnd.Next(0, 10);
                int operator2 = rnd.Next(0, 10);
                int operator3 = rnd.Next(0, 10);

                ////随机组合运算顺序,只做 + 和 * 运算
                switch (rnd.Next(0, 3))
                {
                    case 0:
                        mathResult = operator1 + operator2 * operator3;
                        expression = string.Format("{0} + {1} * {2} = ?", operator1, operator2, operator3);
                        break;
                    case 1:
                        mathResult = operator1 * operator2 + operator3;
                        expression = string.Format("{0} * {1} + {2} = ?", operator1, operator2, operator3);
                        break;
                    default:
                        mathResult = operator2 + operator1 * operator3;
                        expression = string.Format("{0} + {1} * {2} = ?", operator2, operator1, operator3);
                        break;
                }

                using (Bitmap bmp = new Bitmap(150, 25))
                {
                    using (Graphics graph = Graphics.FromImage(bmp))
                    {
                        graph.Clear(Color.FromArgb(232, 238, 247)); ////背景色,可自行设置

                        ////画噪点
                        for (int i = 0; i <= 128; i++)
                        {
                            graph.DrawRectangle(
                                new Pen(Color.FromArgb(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255))),
                                rnd.Next(2, 128),
                                rnd.Next(2, 38),
                                1,
                                1);
                        }

                        ////输出表达式
                        for (int i = 0; i < expression.Length; i++)
                        {
                            graph.DrawString(expression.Substring(i, 1),
                                new Font(FontFamily.GenericSansSerif, 12, FontStyle.Bold),
                                new SolidBrush(Color.FromArgb(rnd.Next(255), rnd.Next(128), rnd.Next(255))),
                                5 + i * 10,
                                rnd.Next(1, 5));
                        }

                        ////画边框,不需要可以注释掉
                        graph.DrawRectangle(new Pen(Color.Firebrick), 0, 0, 150 - 1, 25 - 1);
                    }

                    context.Session[sessionKey] = mathResult; ////将运算结果存入session

                    ////禁用缓存
                    DisableHttpCache(context);

                    ////输出图片到浏览器,我采用的是 gif 格式,可自行设置其他格式
                    context.Response.ContentType = "image/gif";
                    bmp.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Gif);
                    context.Response.End();
                }
            }

            #endregion

            /// <summary>
            /// 禁用缓存
            /// </summary>
            /// <param name="context">httpcontext</param>
            private static void DisableHttpCache(System.Web.HttpContext context)
            {
                ////清除http缓存
                context.Response.ClearHeaders();
                context.Response.ClearContent();
                ////禁用http缓存
                //// http 1.1
                context.Response.AddHeader("Expires", "Mon, 26 Jul 1997 05:00:00 GMT");
                context.Response.AddHeader("Cache-Control", "no-store, no-cache, max-age=0, must-revalidate");
                //// http 1.0
                context.Response.AddHeader("Pragma", "no-cache");
            }
        }

    注: 如果觉得验证码太模糊,可以将画噪点的地方调整为下面的:

                    for (int i = 0; i <= 128; i++)
                    {
                        graph.DrawRectangle(
                            new Pen(Color.FromArgb(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255))),
                            (float)rnd.Next(2, 128),
                            (float)rnd.Next(2, 38),
                            0.5F, //噪点的粒度
                            0.5F);//噪点的粒度,可以调节这两个值,到认为自己满意
                    }

    使用说明:

    介绍两种使用方式:
    ——————————————————————–
    1. 使用普通的 aspx 页面承载输出 image
    2. 使用 HttpHandler文件,就是 ashx文件承载输出image
    ——————————————————————–
    推荐后者,使用方法如下:

    aspx页面

    //新建一个ASPX页面,例如: mvc.aspx
    //在 Page_Load 事件里,写入
    
        protected void Page_Load(object sender, EventArgs e)
        {
            MathVerifyCode mVC = new MathVerifyCode();
            mVC.OutputImage(HttpContext.Current, "mvc");
            //mvc是保存验证码结果的SESSION的key
        }

    ashx方式

    //新建一个 ashx 页面,例如: Mvc.ashx
    //记得此ashx文件的类,一定要继承 System.Web.SessionState.IRequiresSessionState 才可以使用session
    
    public class Mvc : IHttpHandler, System.Web.SessionState.IRequiresSessionState
    {
        public void ProcessRequest (HttpContext context) {
            MathVerifyCode mvc = new MathVerifyCode();
            mvc.OutputImage(context, "mvc");
        }
    
        public bool IsReusable {
            get {
                return true;
            }
        }
    }

    在需要显示验证码的地方,加入:

    <img src="mvc.aspx" alt=""/>
    
    或者
    
    <img src="mvc.ashx" alt=""/>
  • 相关阅读:
    MySQL(一)
    Python(二十九)
    python(二十八)
    python(二十七)
    Python(二十六)
    Linux的安装包命令/yum 与 Rpm
    linux系统监控与硬盘分区/格式化/文件系统管理
    linux操作系统及命令Part 2
    linux命令大全总结
    linux 用户/群组/权限
  • 原文地址:https://www.cnblogs.com/wequst/p/1371767.html
Copyright © 2020-2023  润新知