MVC+EasyUI+三层新闻网站建立 验证码生成(三)

 更新时间:2021年9月22日 10:03  点击:2020

我们在项目中的NewWeb.Common类库里面建立一个类用来存放生成验证码的代码。

这里我类的名字叫 ValidateCode

生成验证码(ValidateCode)类的代码:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;

namespace NewWeb.Common
{
  public class ValidateCode
  {
      public 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;
      }
      /// <summary>
      /// 创建验证码的图片
      /// </summary>
      /// <param name="context">要输出到的page对象</param>
      /// <param name="validateNum">验证码</param>
      public void CreateValidateGraphic(string validateCode, HttpContext context)
      {
        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);
          //输出图片流
          context.Response.Clear();
          context.Response.ContentType = "image/jpeg";
          context.Response.BinaryWrite(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;
      }


      //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();
        }
      }
    }
  
}

这时需要在程序中引入两个命名空间 System.Drawing和System.Web。

完成之后到LoginController控制器里面去新建一个ActionResult   就叫ValidateCode 用于生成验证码。(这里要先对NewWeb.Common引用)

生成验证码代码如下:

 public ActionResult ValidateCode()
    {
      Common.ValidateCode validateCode = new Common.ValidateCode();
      string code = validateCode.CreateValidateCode(4); //生成的验证码4个长度
      Session["validateCode"] = code;
      byte[] buffer = validateCode.CreateValidateGraphic(code);//创建验证码图片
      return File(buffer, "image/jpeg");//返回图片
    }

到Login视图里面的index页面去把img的src补充为:

 <tr>
   <td style="width:20px"></td>
    <td><img id="image" src="/Login/ValidateCode/?id=1" style="float: left; height: 24px;" /></td>
    <td><a href="javascript:void(0)" onclick="changeCheckCode();return false;">看不清,换一张</a></td>
</tr>

就可以看到页面上面显示出来验证码

下面要做的就是点击切换验证码,这是通过js实现的代码

 <script type="text/javascript">
    $(function () {
      
      initWin(); //初始化登录窗体
      changeCheckCode(); //切换验证码
    });
    function initWin() {
      $("#win").window({
        title: "登录",
        width: 400,
        height: 270,
        collapsible: false,
        minimizable: false,
        maximizable: false,
        closable: false,
        modal: true,
        resizable: false,
      });
      
    }
    //切换验证码
    function changeCheckCode() {
      $("#changeVcode").click(function () {
        $("#image").attr("src", $("#image").attr("src") + 1);
      });
    }
  </script>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。

[!--infotagslink--]

相关文章

  • PHP 验证码不显示只有一个小红叉的解决方法

    最近想自学PHP ,做了个验证码,但不知道怎么搞的,总出现一个如下图的小红叉,但验证码就是显示不出来,原因如下 未修改之前,出现如下错误; (1)修改步骤如下,原因如下,原因是apache权限没开, (2)点击打开php.int., 搜索extension=ph...2013-10-04
  • JS实现随机生成验证码

    这篇文章主要为大家详细介绍了JS实现随机生成验证码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-06
  • jQuery Real Person验证码插件防止表单自动提交

    本文介绍的jQuery插件有点特殊,防自动提交表单的验证工具,就是我们经常用到的验证码工具,先给大家看看效果。效果图如下: 使用说明 需要使用jQuery库文件和Real Person库文件 同时需要自定义验证码显示的CSS样式 使用实例...2015-11-08
  • Jquery插件实现点击获取验证码后60秒内禁止重新获取

    通过jquery.cookie.js插件可以快速实现“点击获取验证码后60秒内禁止重新获取(防刷新)”的功能效果图:先到官网(http://plugins.jquery.com/cookie/)下载cookie插件,放到相应文件夹,代码如下:复制代码 代码如下: <!DOCTYPE ht...2015-03-15
  • php实现点击可刷新验证码

    验证码类文件 CreateImg.class.php <&#63;php class ValidationCode { private $width,$height,$codenum; public $checkcode; //产生的验证码 private $checkimage; //验证码图片 private $disturbColor = ''; /...2015-11-08
  • SpringMVC文件上传原理及实现过程解析

    这篇文章主要介绍了SpringMVC文件上传原理及实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-07-15
  • 基于JavaScript实现验证码功能

    这篇文章主要介绍了基于JavaScript实现验证码功能的相关资料...2017-04-03
  • C# MVC模式中应该怎样区分应用程序逻辑(Controller层)和业务逻辑(Model层)?

    这篇文章主要介绍了C# MVC模式中应该怎样区分应用程序逻辑(Controller层)和业务逻辑(Model层)?,这也小编做.NET项目时经常思考和让人混乱的一个问题,这篇文章写的挺好,一下清晰了许多,需要的朋友可以参考下...2020-06-25
  • 单击按钮发送验证码,出现倒计时的简单实例

    下面小编就为大家带来一篇单击按钮发送验证码,出现倒计时的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 代码...2017-07-06
  • PHP验证码生成与验证例子

    验证码是一个现在WEB2.0中常见的一个功能了,像注册、登录又或者是留言页面,都需要注册码来验证当前操作者的合法性,我们会看到有些网站没有验证码,但那是更高级的验证了,...2016-11-25
  • 使用Maven 搭建 Spring MVC 本地部署Tomcat的详细教程

    这篇文章主要介绍了使用Maven 搭建 Spring MVC 本地部署Tomcat,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-08-16
  • 基于Pytorch版yolov5的滑块验证码破解思路详解

    这篇文章主要介绍了基于Pytorch版yolov5的滑块验证码破解思路详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-02-25
  • Bootstrap中文本框的宽度变窄并且加入一副验证码图片的实现方法

    这篇文章主要介绍了Bootstrap中文本框的宽度变窄并且加入一副验证码图片的实现方法的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下...2016-06-24
  • SpringMvc自动装箱及GET请求参数原理解析

    这篇文章主要介绍了SpringMvc自动装箱及GET请求参数原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-19
  • SpringMvc获取请求头请求体消息过程解析

    这篇文章主要介绍了SpringMvc获取请求头请求体消息过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-17
  • 工信部的ICP备案网站登录时验证码一直输入不正确怎么回事

    工信部的ICP备案网站登录时验证码一直输入不正确怎么回事,为了防止一些机器采集人工信部对于查询验证做得识别度极低,所以许多的朋友都会发现输入验证码一直有问题了,那...2016-10-10
  • Springmvc ResponseBody响应json数据实现过程

    这篇文章主要介绍了Springmvc ResponseBody响应json数据实现过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-10-26
  • jQuery实现发送验证码控制按钮禁用功能

    最近接到新需求,需要实现一个点击发送验证码之后,按钮禁用,在5秒之后取消禁用,看似需求很简单,实现起来还真的好好动动脑筋,下面小编把jquery控制按钮禁用核心代码分享给大家,需要的朋友参考下吧...2021-07-24
  • 基于C#后台调用跨域MVC服务及带Cookie验证的实现

    本篇文章介绍了,基于C#后台调用跨域MVC服务及带Cookie验证的实现。需要的朋友参考下...2020-06-25
  • Web制作验证码功能实例代码

    web开发中,经常会使用验证码功能,例如登录、注册,或其他关键功能之前经常会使用。下面通过实例代码给大家介绍Web制作验证码功能实例代码,感兴趣的朋友一起看看吧...2017-06-24