zoukankan      html  css  js  c++  java
  • .Net (MVC) 随机生成验证码

       以前一直对C#的GDI画图部分知识点不怎么用所以忘得差不多了,这两天正好公司要做一个博客系统,其中一个需求就是留言时为了防止恶意攻击必须填写验证码,正好借着这个机会复习了一下,以下是实现代码,写的比较简单。

    View 层

     1 @{
     2     ViewBag.Title = "Home Page";
     3 } 
     4 <div class="row">
     5      <h1>test</h1>
     6     <div class="col-lg-12">
     7         @using(Html.BeginForm("Index","Home", FormMethod.Post, new {@id="form",@enctype = "multipart/form-data" }))
     8         {
     9             <div class="form-group">
    10                 <input type="file" name="file"/>
    11                 <input type="file" name="files" />
    12                 <button>提交</button>
    13             </div>
    14             <div class="form-group">
    15                 <div class="col-lg-1">
    16                     <input type="text" class="col-lg-3"/>
    17                 </div>
    18                 <div class="col-lg-3">
    19                     <img id="img" onclick="CheckCode()" src="/Home/GetValidateCode" style="height:30px;110px" title="点击更换" alt="点击更换" />
    20                     <a href="javascript:void(0)" onclick="CheckCode()">点击更换</a>
    21                 </div>
    22             </div>
    23         }
    24     </div>
    25 </div>
    26 @section scripts{
    27 <script>
    28     $(function () { 
    29         $("#img").click(function () {
    30             CheckCode()
    31         })
    32     })
    33     function CheckCode() {
    34         $("#img").attr("src", "/Home/GetValidateCode?date="+new Date());
    35     }
    36      
    37 </script>
    38 }
    View Code

    Controller 层 

     1 /// <summary>
     2         /// View页面请求获得验证码
     3         /// </summary>
     4         public void GetValidateCode()
     5         {
     6             //获取随机生成的编码
     7             string ValiDateCode = GetValiDateCode();
     8             Session["Key"] = ValiDateCode;
     9             byte[] bytes = GetValidateCode(ValiDateCode);
    10             Response.ClearContent();
    11             Response.ContentType = "image/Gif";
    12             Response.BinaryWrite(bytes);
    13             // 也可以用MVC 的FileResult 
    14             //return File(bytes, @"image/jpeg");
    15         }
    16 
    17         /// <summary>
    18         /// 生成验证码方法
    19         /// </summary>
    20         /// <param name="ValiDateCode"></param>
    21         /// <returns></returns>
    22         public static byte[] GetValidateCode(string ValiDateCode)
    23         { 
    24             Bitmap img = new Bitmap((int)Math.Ceiling(ValiDateCode.Length * 12.6), 22);   //创建 Bitmap对象 
    25             Graphics graphics = Graphics.FromImage(img);                                  //创建 Graphics 对象 
    26             graphics.Clear(Color.White);                                                  //清空图片背景色
    27             Random random = new Random();                                                 //创建 Random 实例
    28             for (int i = 0; i <= 24; i++)
    29             {
    30                 int x1 = random.Next(img.Width);
    31                 int x2 = random.Next(img.Width);
    32                 int y1 = random.Next(img.Height);
    33                 int y2 = random.Next(img.Height);
    34                 graphics.DrawLine(new Pen(Color.Silver),x1, y1, x2, y2);                  //在图片上画噪点线
    35             }
    36             Font font = new Font("Arial", 13,(FontStyle.Bold));
    37             //创建 Brush 对象, LinearGradientBrush实现字体渐变效果  LinearGradientBrush(Rectangle rectangle,Color color1,Color color2,float angle, bool isAngleScaleable)                                
    38             LinearGradientBrush linear = new LinearGradientBrush(new Rectangle(0, 0, img.Width, img.Height), Color.Gray, Color.Blue, 1.4f, true);
    39             graphics.DrawString(ValiDateCode, font, linear, 2, 2);                        //绘制生成的验证码,
    40             graphics.DrawRectangle(new Pen(Color.Silver), 0, 0, img.Width - 1, img.Height - 1);
    41             MemoryStream stream = new MemoryStream();                                     //创建 流对象
    42             img.Save(stream, ImageFormat.Jpeg);                                           //将图像以特定的格式保存到流对象中
    43             return stream.ToArray();
    44         }
    45 
    46         /// <summary>
    47         /// 获取随机生成的验证码
    48         /// </summary>
    49         /// <returns></returns>
    50         private static string GetValiDateCode()
    51         {
    52             string[] letter = new string[] { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "i", "m", "n", "o", "p", "Q" };
    53             Random random = new Random();
    54             StringBuilder result = new StringBuilder();
    55             for (int i = 1; i <= 5; i++)
    56             {
    57                 if (i % 2 == 0)
    58                 {
    59                     result.Append(letter[random.Next(1, 15)]);
    60                 }
    61                 else
    62                 {
    63                     result.Append(random.Next(1, 9));
    64                 }
    65             }
    66             return result.ToString();
    67         }
    View Code

    效果图:

  • 相关阅读:
    获取Mac地址
    GbkToUtf8 Utf8ToGbk PackHttp
    first Automation
    win32 Dll 中添加afx.h 出现如下错误 error LNK2005: _DllMain@12 already defined
    OpenSUSE 开启SSH 和网络设置
    systemctl命令用法详解
    浅谈Python的列表和链表
    用Python实现最大堆
    写一个解二阶魔方的程序
    暴力破解SixPack问题
  • 原文地址:https://www.cnblogs.com/wwj1992/p/5643447.html
Copyright © 2011-2022 走看看