数学运算表达式形式的验证码 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
——————————————————————–
推荐后者,使用方法如下:

 

silk_0.png 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
    }

silk_0.png 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;
        }
    }
}

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

<img src="mvc.aspx" alt=""/>

或者

<img src="mvc.ashx" alt=""/>

转载于:https://www.cnblogs.com/wequst/archive/2009/01/08/1371767.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值