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

    /// <summary>
        /// 生成验证码
        /// </summary>
        public partial class OperateContext
        {
            #region 1.生成验证码 +string GenerateCode(int count, VCodeTypeEnum type)
            public string GenerateCode(int count, VCodeTypeEnum type)
            { 
                ValidateCode validateCode = new ValidateCode();
                string code = validateCode.CreateValidateCode(count);
                Session[type.ToString()] = code;
                return code;
            }
            #endregion
    
            #region 2.生成验证码图片 +byte[] GenerateCode(VCodeTypeEnum type, int count = 4)
            /// <summary>
            /// 2.生成验证码图片
            /// </summary>
            /// <param name="type"></param>
            /// <param name="count"></param>
            /// <returns></returns>
            public byte[] GenerateCode(VCodeTypeEnum type, int count = 4)
            {
                ValidateCode validateCode = new ValidateCode();
                string code = validateCode.CreateValidateCode(count);
                Session[type.ToString()] = code;
                CallContext.SetData(type.ToString(), code);
    
    
                return validateCode.CreateValidateGraphic(code);
            }
            #endregion
    
            #region 3.生成验证码 并返回图片 +byte[] GenerateCode(VCodeTypeEnum type, int count = 4)
            /// <summary>
            /// 生成验证码 并返回图片
            /// </summary>
            /// <param name="type"></param>
            /// <param name="count"></param>
            /// <param name="bytes"></param>
            /// <returns></returns>
            public string GenerateCode(VCodeTypeEnum type, int count, out byte[] bytes)
            {
                ValidateCode validateCode = new ValidateCode();
                string code = validateCode.CreateValidateCode(count);
                Session[type.ToString()] = code;
                bytes = validateCode.CreateValidateGraphic(code);
                return code;
            }
            #endregion
    
            #region 4.验证码校验 +bool CheckVCode(VCodeTypeEnum type, string num)
            /// <summary>
            /// 4.验证码校验
            /// </summary>
            /// <param name="type"></param>
            /// <param name="num"></param>
            /// <returns></returns>
            public bool CheckVCode(VCodeTypeEnum type, string num)
            {
                string vcode = type.ToString();
                string cnum = Session[vcode] == null
                    ? ""
                    : Session[vcode].ToString();
    
                if (num == cnum && !string.IsNullOrEmpty(num))
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            #endregion
        }
        
        
        
        
        
        
        
           public class ValidateCode
        { 
            /// <summary>
            /// 验证码的最大长度
            /// </summary>
            public int MaxLength
            {
                get { return 10; }
            }
            /// <summary>
            /// 验证码的最小长度
            /// </summary>
            public int MinLength
            {
                get { return 1; }
            }
            /// <summary>
            /// 生成验证码
            /// </summary>
            /// <param name="length">指定验证码的长度</param>
            /// <returns></returns>
            public string CreateValidateCode(int length)
            {
                int[] randMembers = new int[length];
                int[] validateNums = new int[length];
                string validateNumberStr = "";
                //生成起始序列值
                int seekSeek = unchecked((int)DateTime.Now.Ticks);
                Random seekRand = new Random(seekSeek);
                int beginSeek = (int)seekRand.Next(0, Int32.MaxValue - length * 10000);
                int[] seeks = new int[length];
                for (int i = 0; i < length; i++)
                {
                    beginSeek += 10000;
                    seeks[i] = beginSeek;
                }
                //生成随机数字
                for (int i = 0; i < length; i++)
                {
                    Random rand = new Random(seeks[i]);
                    int pownum = 1 * (int)Math.Pow(10, length);
                    randMembers[i] = rand.Next(pownum, Int32.MaxValue);
                }
                //抽取随机数字
                for (int i = 0; i < length; i++)
                {
                    string numStr = randMembers[i].ToString();
                    int numLength = numStr.Length;
                    Random rand = new Random();
                    int numPosition = rand.Next(0, numLength - 1);
                    validateNums[i] = Int32.Parse(numStr.Substring(numPosition, 1));
                }
                //生成验证码
                for (int i = 0; i < length; i++)
                {
                    validateNumberStr += validateNums[i].ToString();
                }
                return validateNumberStr;
            }
    
            //C# MVC 升级版
            /// <summary>
            /// 创建验证码的图片
            /// </summary>
            /// <param name="containsPage">要输出到的page对象</param>
            /// <param name="validateNum">验证码</param>
            public byte[] CreateValidateGraphic(string validateCode)
            {
                Bitmap image = new Bitmap((int)Math.Ceiling(validateCode.Length * 12.0), 22);
                Graphics g = Graphics.FromImage(image);
                try
                {
                    //生成随机生成器
                    Random random = new Random();
                    //清空图片背景色
                    g.Clear(Color.White);
                    //画图片的干扰线
                    for (int i = 0; i < 25; i++)
                    {
                        int x1 = random.Next(image.Width);
                        int x2 = random.Next(image.Width);
                        int y1 = random.Next(image.Height);
                        int y2 = random.Next(image.Height);
                        g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
                    }
                    Font font = new Font("Arial", 12, (FontStyle.Bold | FontStyle.Italic));
                    LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.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(image.Width);
                        int y = random.Next(image.Height);
                        image.SetPixel(x, y, Color.FromArgb(random.Next()));
                    }
                    //画图片的边框线
                    g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
                    //保存图片数据
                    MemoryStream stream = new MemoryStream();
                    image.Save(stream, ImageFormat.Jpeg);
                    //输出图片流
                    return stream.ToArray();
                }
                finally
                {
                    g.Dispose();
                    image.Dispose();
                }
            }
    
            /// <summary>
            /// 得到验证码图片的长度
            /// </summary>
            /// <param name="validateNumLength">验证码的长度</param>
            /// <returns></returns>
            public static int GetImageWidth(int validateNumLength)
            {
                return (int)(validateNumLength * 12.0);
            }
            /// <summary>
            /// 得到验证码的高度
            /// </summary>
            /// <returns></returns>
            public static double GetImageHeight()
            {
                return 22.5;
            }
    
        }
        
        
        
         public enum VCodeTypeEnum {login,phone,  password,register,email } 
  • 相关阅读:
    WPF 关于拖拽打开文件的注意事项
    asp.net core 3.1中对Mongodb BsonDocument的序列化和反序列化支持
    用百度webuploader分片上传大文件
    多线程学习笔记
    web.config数据库连接字符串加密
    Visual Studio 2010 常用快捷方式
    Team Foundation Server 2013 日常使用使用手册(四)分支与合并
    Team Foundation Server 2013 日常使用使用手册(三)上传新工程、创建任务、创建bug、设置预警
    Team Foundation Server 2013 日常使用使用手册(二)修改、签入、撤销、回滚、对比代码变更
    Team Foundation Server 2013 日常使用使用手册(一)-本地连接TFS、查看任务
  • 原文地址:https://www.cnblogs.com/valeb/p/7569986.html
Copyright © 2011-2022 走看看