侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

技术  /  管理员 发布于 5年前   333

我们在项目中的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="https:Login/ValidateCode/?id=1" style="float: left; height: 24px;" /></td>    <td><a href="" 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>

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


  • 上一条:
    MVC+EasyUI+三层新闻网站建立 后台登录界面的搭建(二)
    下一条:
    SpringMVC+Ajax实现文件批量上传和下载功能实例代码
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 2024.07.09日OpenAI将终止对中国等国家和地区API服务(0个评论)
    • 2024/6/9最新免费公益节点SSR/V2ray/Shadowrocket/Clash节点分享|科学上网|免费梯子(1个评论)
    • 国外服务器实现api.openai.com反代nginx配置(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-07
    • 2017-08
    • 2017-09
    • 2018-01
    • 2018-07
    • 2018-08
    • 2018-09
    • 2018-12
    • 2019-01
    • 2019-02
    • 2019-03
    • 2019-04
    • 2019-05
    • 2019-06
    • 2019-07
    • 2019-08
    • 2019-09
    • 2019-10
    • 2019-11
    • 2019-12
    • 2020-01
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2020-10
    • 2020-11
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-04
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-12
    • 2024-02
    • 2024-04
    • 2024-05
    • 2024-06
    • 2025-02
    • 2025-07
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客