码迷,mamicode.com
首页 > Web开发 > 详细

.Net MVC用户注册验证码

时间:2020-09-24 21:17:49      阅读:51      评论:0      收藏:0      [点我收藏+]

标签:gui   length   col   drawrect   +=   htc   htm   ack   substring   

  添加验证码生成类Captcha

public class Captcha
    {
        /// <summary>
        /// 生成随机数
        /// </summary>
        /// <param name="codeLen">数据的长度</param>
        /// <returns></returns>
        public string CreateRandomCode(int codeLen)
        {
            var sCode = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,1,2,3,4,5,6,7,8,9,0";
            var aCode = sCode.Split(‘,‘);
            string CAPTCHA = "";
            for (var i = 0; i < codeLen; i++)
            {
                Random rnd = new Random(new Random(Guid.NewGuid().GetHashCode()).Next(1, 10));
                int index = rnd.Next(aCode.Length);
                CAPTCHA += aCode[index];
            }
            return CAPTCHA;
        }

        /// <summary>
        /// 根据随机数生成图片
        /// </summary>
        /// <param name="validateCode">图片中的文字</param>
        /// <returns></returns>
        public byte[] CreateValidGraphic(string validateCode)
        {
            Bitmap img = new Bitmap((int)Math.Ceiling(validateCode.Length * 26.0), 40);
            Graphics g = Graphics.FromImage(img);
            try
            {
                Random random = new Random();//生成随机数
                g.Clear(Color.White);//清空图片背景色
                for (int i = 0; i < 25; i++)//画图片的干扰线
                {
                    int x1 = random.Next(img.Width);
                    int x2 = random.Next(img.Width);
                    int y1 = random.Next(img.Height);
                    int y2 = random.Next(img.Height);
                    g.DrawLine(new Pen(GetRandomDeepColor(false)), x1, x2, y1, y2);
                }
                Font font = new Font("微软雅黑", 18, (FontStyle.Bold | FontStyle.Italic));
                //渐变性颜色
                //LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, img.Width, img.Height), Color.Blue, Color.DarkRed, 1.2f, true);
                var fontBrush = new SolidBrush(Color.Black);
                //深色
                for (var i = 0; i < validateCode.Length; i++)
                {
                    fontBrush.Color = GetRandomDeepColor(true);
                    g.DrawString(validateCode.Substring(i, 1), font, fontBrush, 1 + (i * 22), 2);
                }
                //g.DrawString(validateCode, font, fontBrush, 3, 2);
                for (int i = 0; i < 100; i++)//画图片的前景干扰点
                {
                    int x = random.Next(img.Width);
                    int y = random.Next(img.Height);
                    img.SetPixel(x, y, GetRandomDeepColor(false));
                }
                g.DrawRectangle(new Pen(Color.Silver), 0, 0, img.Width - 1, img.Height - 1);//画图片的边框线
                MemoryStream stream = new MemoryStream();
                img.Save(stream, ImageFormat.Jpeg);
                return stream.ToArray();//输入图片
            }
            catch (Exception)
            {
                throw;
            }
        }

        public Color GetRandomDeepColor(bool islIghtColour)
        {
            Double sumrgb = 193, r = 0, g = 0, b = 0;
            if (islIghtColour)
            {
                //排除浅色
                while (sumrgb > 192)
                {
                    //得到随机的颜色值 
                    r = Math.Truncate(new Random(Guid.NewGuid().GetHashCode()).NextDouble() * 256);
                    g = Math.Truncate(new Random(Guid.NewGuid().GetHashCode()).NextDouble() * 256);
                    b = Math.Truncate(new Random(Guid.NewGuid().GetHashCode()).NextDouble() * 256);
                    sumrgb = r * 0.299 + g * 0.578 + b * 0.114;
                }
            }
            else
            {
                r = Math.Truncate(new Random(Guid.NewGuid().GetHashCode()).NextDouble() * 256);
                g = Math.Truncate(new Random(Guid.NewGuid().GetHashCode()).NextDouble() * 256);
                b = Math.Truncate(new Random(Guid.NewGuid().GetHashCode()).NextDouble() * 256);
            }
            return Color.FromArgb((Int32)r, (Int32)g, (Int32)b);
        }
    }

  控制器调用生成方法

/// <summary>
        /// 获取验证码
        /// </summary>
        /// <returns></returns>
        public ActionResult GetRandomCode()
        {
            Captcha captcha = new Captcha();
            string code = captcha.CreateRandomCode(4);
            Session["validateCode"] = code;
            return File(captcha.CreateValidGraphic(code), "image/jpeg");
        }

  前端使用

 <img alt="验证码图片" id="imgValidateCode" title="看不清?点击换一张" src="@Url.Action("GetRandomCode", "Home")" onclick="this.src=this.src+‘?‘"/>

  最后拿着session判断验证码准确性。

 

.Net MVC用户注册验证码

标签:gui   length   col   drawrect   +=   htc   htm   ack   substring   

原文地址:https://www.cnblogs.com/binzi/p/13718288.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!