• MVC验证码


    Home控制器

     1 using bigtree.Actions;
     2 using System;
     3 using System.Collections.Generic;
     4 using System.Linq;
     5 using System.Web;
     6 using System.Web.Mvc;
     7 
     8 namespace MvcVcode.Content
     9 {
    10     public class HomeController : Controller
    11     {
    12         //
    13         // GET: /Home/
    14 
    15         public ActionResult Index()
    16         {
    17             return View();
    18         }
    19 
    20         /// <summary>  
    21         /// 调用Itcast.CMS.Common类库中的ValidateCode类 来显示验证码  
    22         /// </summary>  
    23         /// <param name="str">无用处的参数</param>  
    24         /// <returns>图片文件</returns>  
    25         public ActionResult ShowValiDataCode(string str)
    26         {
    27             ValidateCode vcode = new ValidateCode();
    28             string code = vcode.CreateValidateCode(5);
    29             Session["vCode"] = code;
    30             return File(vcode.CreateValidateGraphic(code), "image/JPEG");
    31         }
    32 
    33 
    34     }
    35 }

    视图

     1 @{
     2     Layout = null;
     3 }
     4 
     5 <!DOCTYPE html>
     6 
     7 <html>
     8 <head>
     9     <meta name="viewport" content="width=device-width" />
    10     <title>Index</title>
    11     <script src="~/Scripts/jquery-1.8.2.js"></script>
    12 </head>
    13 <body>
    14     <div>
    15         <img src="Home/ShowValiDataCode/?id=1" class="validataCode" id="ImageCode" />
    16     </div>
    17 </body>
    18 </html>
    19 <script type="text/javascript">
    20     $(function () {
    21         $(".validataCode").click(function () {
    22             replaceVcode();
    23         })
    24     })
    25 
    26     function replaceVcode() {
    27         $("#ImageCode").attr("src", $("#ImageCode").attr("src") + 1);/**/
    28     }
    29     function afterLogin(data) { //
    30 
    31         var serverData = data.split(":"); //对请求返还的出数据进行处理;例如这条数据(ok:登陆成功)
    32         if (serverData[0] == "ok") {
    33             $("#serverMes").text(serverData[1]);
    34             window.location.href = "/Login/Login"; //如果登陆成功(ok)就跳转到主页
    35         } else if (serverData[0] == "no") {
    36             $("#serverMes").text(serverData[1]); //提示错误
    37             replaceVcode(); //刷新验证码
    38         }
    39     }
    40 </script>  

    验证码代码ValidateCode.cs

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Web;
      5 using System.Drawing;
      6 using System.Drawing.Drawing2D;
      7 using System.IO;
      8 using System.Drawing.Imaging;
      9 
     10 namespace bigtree.Actions
     11 {
     12     public class ValidateCode
     13     {
     14         //// <summary>
     15         /// 生成验证码
     16         /// </summary>
     17         /// <param name="length">指定验证码的长度</param>
     18         /// <returns></returns>
     19         public string CreateValidateCode(int length)
     20         {
     21             int[] randMembers = new int[length];
     22             int[] validateNums = new int[length];
     23             string validateNumberStr = "";
     24             //生成起始序列值
     25             int seekSeek = unchecked((int)DateTime.Now.Ticks);
     26             Random seekRand = new Random(seekSeek);
     27             int beginSeek = (int)seekRand.Next(0, Int32.MaxValue - length * 10000);
     28             int[] seeks = new int[length];
     29             for (int i = 0; i < length; i++)
     30             {
     31                 beginSeek += 10000;
     32                 seeks[i] = beginSeek;
     33             }
     34             //生成随机数字
     35             for (int i = 0; i < length; i++)
     36             {
     37                 Random rand = new Random(seeks[i]);
     38                 int pownum = 1 * (int)Math.Pow(10, length);
     39                 randMembers[i] = rand.Next(pownum, Int32.MaxValue);
     40             }
     41             //抽取随机数字
     42             for (int i = 0; i < length; i++)
     43             {
     44                 string numStr = randMembers[i].ToString();
     45                 int numLength = numStr.Length;
     46                 Random rand = new Random();
     47                 int numPosition = rand.Next(0, numLength - 1);
     48                 validateNums[i] = Int32.Parse(numStr.Substring(numPosition, 1));
     49             }
     50             //生成验证码
     51             for (int i = 0; i < length; i++)
     52             {
     53                 validateNumberStr += validateNums[i].ToString();
     54             }
     55             return validateNumberStr;
     56         }
     57 
     58 
     59 
     60 
     61 
     62         /// <summary>
     63         /// 创建验证码的图片
     64         /// </summary>
     65         /// <param name="containsPage">要输出到的page对象</param>
     66         /// <param name="validateNum">验证码</param>
     67         public byte[] CreateValidateGraphic(string validateCode)
     68         {
     69             Bitmap image = new Bitmap((int)Math.Ceiling(validateCode.Length * 12.0), 22);
     70             Graphics g = Graphics.FromImage(image);
     71             try
     72             {
     73                 //生成随机生成器
     74                 Random random = new Random();
     75                 //清空图片背景色
     76                 g.Clear(Color.White);
     77                 //画图片的干扰线
     78                 for (int i = 0; i < 25; i++)
     79                 {
     80                     int x1 = random.Next(image.Width);
     81                     int x2 = random.Next(image.Width);
     82                     int y1 = random.Next(image.Height);
     83                     int y2 = random.Next(image.Height);
     84                     g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
     85                 }
     86                 Font font = new Font("Arial", 12, (FontStyle.Bold | FontStyle.Italic));
     87                 LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height),
     88                  Color.Blue, Color.DarkRed, 1.2f, true);
     89                 g.DrawString(validateCode, font, brush, 3, 2);
     90                 //画图片的前景干扰点
     91                 for (int i = 0; i < 100; i++)
     92                 {
     93                     int x = random.Next(image.Width);
     94                     int y = random.Next(image.Height);
     95                     image.SetPixel(x, y, Color.FromArgb(random.Next()));
     96                 }
     97                 //画图片的边框线
     98                 g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
     99                 //保存图片数据
    100                 MemoryStream stream = new MemoryStream();
    101                 image.Save(stream, ImageFormat.Jpeg);
    102                 //输出图片流
    103                 return stream.ToArray();
    104             }
    105             finally
    106             {
    107                 g.Dispose();
    108                 image.Dispose();
    109             }
    110         }
    111     }
    112 }

    效果图片如下

  • 相关阅读:
    拷贝构造函数的参数为什么必须使用引用类型(避免无限递归拷贝,但其实编译器已经强制要求了)
    MAKE gnu
    设计模式之观察者模式(Observable与Observer)
    WCF从零学习之设计和实现服务协定2
    CLR_Via_C#学习笔记之枚举
    事件与动画
    Shell—学习之心得
    Asp.net MVC中提交集合对象,实现Model绑定
    一个23岁大学生的开源项目 谷歌要竖中指了
    C++中的虚函数总结
  • 原文地址:https://www.cnblogs.com/felix-wang/p/7324320.html
Copyright © 2020-2023  润新知