zoukankan      html  css  js  c++  java
  • c#生成验证码

    using System.Drawing;
    using System.Drawing.Drawing2D;
    using System.Drawing.Imaging;
    using System.IO;

    需要特别引用:System.Drawing

            /// <summary>
            /// 生成随机数
            /// </summary>
            /// <param name="codeLen">数据的长度</param>
            /// <returns></returns>
            public static string CreateRandomCode(int codeLen)
            {
                string allChar = "0,1,2,3,4,5,6,7,8,9,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";
                string[] allCharAry = allChar.Split(',');
                string randomCode = "";
                int temp = -1;
                Random rand = new Random();
                for (int i = 0; i < codeLen; i++)
                {
                    if (temp != -1)
                    {
                        rand = new Random(i * temp * ((int)DateTime.Now.Ticks));
                    }
                    int t = rand.Next(35);
                    if (temp == t)
                    {
                        return CreateRandomCode(codeLen);
                    }
                    temp = t;
                    randomCode += allCharAry[t];
                }
                return randomCode;
            }
           /// <summary>
           /// 根据随机数生成图片
           /// </summary>
           /// <param name="validateCode">图片中的文字</param>
           /// <returns></returns>
            public byte[] CreateValidGraphic(string validateCode)
            {
                Bitmap img = new Bitmap((int)Math.Ceiling(validateCode.Length * 16.0), 27);
                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(Color.Silver), x1, x2, y1, y2);
                    }
                    Font font = new Font("Arial", 13, (FontStyle.Bold | FontStyle.Italic));
                    LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, img.Width, img.Height), Color.Blue, Color.DarkRed, 1.2f, true);
                    g.DrawString(validateCode, font, brush, 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, Color.FromArgb(random.Next()));
                    }
                    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;
                }
            }

    在MVC项目中使用

    控制器Index中的代码

            public ActionResult Index()
            {
                return View();
            }
    
            public ActionResult GetRandomCode()
            {
                string code = CreateRandomCode(4);
                TempData["validateCode"] = code;
                return File(CreateValidGraphic(code), "image/jpeg");
            }

    视图Index.cshtml中的代码

    @using (Html.BeginForm())
    {
        <img alt="验证码图片" id="imgValidateCode" title="看不清?点击换一张" src="@Url.Action("GetRandomCode")" onclick="this.src=this.src+'?'"/>
    }

     关于验证码的后台校验:

    当视图模型验证通过的之后,需要再对验证码进行校验。

    在MVC中template每次取出值后就会过期,但在asp.net中session中的验证码不会过期,可能需要手动让验证码过期。

  • 相关阅读:
    Rotation Kinematics
    离职 mark
    PnP 问题方程怎么列?
    DSO windowed optimization 代码 (4)
    Adjoint of SE(3)
    IMU 预积分推导
    DSO windowed optimization 代码 (3)
    DSO windowed optimization 代码 (2)
    OKVIS 代码框架
    DSO windowed optimization 代码 (1)
  • 原文地址:https://www.cnblogs.com/vichin/p/12243345.html
Copyright © 2011-2022 走看看