先看一个核心验证码类(不用在意实现过程,直接copy就行),下面包含了两种验证码图片(原理一样),代码如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.Web;
  5. using System.Web.UI;
  6. using System.Web.UI.WebControls;
  7. using System.IO;
  8. using System.Drawing.Imaging;
  9. namespace TyMall.Util
  10. {
  11. public class Yzm : System.Web.UI.Page
  12. {
  13. #region 生成4个随机数
  14. public string RandCode()
  15. {
  16. int CodeCount = 4;//生成4个随机数
  17. string randomChar = "2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,T,U,V,W,X,Y,Z";
  18. randomChar = randomChar.Replace(",", "");
  19. string RandomCode = "";
  20. System.Threading.Thread.Sleep(3);
  21. char[] allCharArray = randomChar.ToCharArray();
  22. int n = allCharArray.Length;
  23. System.Random random = new Random(~unchecked((int)DateTime.Now.Ticks));
  24. for (int i = 0; i < CodeCount; i++)
  25. {
  26. int rnd = random.Next(0, n);
  27. RandomCode += allCharArray[rnd];
  28. }
  29. return RandomCode;
  30. }
  31. #endregion
  32. #region 验证码--方式1
  33. ///  <summary>
  34. ///  验证码--方式1 创建验证码图片
  35. ///  </summary>
  36. ///  <param  name="randomcode">验证码</param>
  37. public byte[] CreateImage(string randomcode)
  38. {
  39. int randAngle = 40; //随机转动角度
  40. int mapwidth = (int)(randomcode.Length * 18);
  41. Bitmap map = new Bitmap(mapwidth, 24);//创建图片背景
  42. Graphics graph = Graphics.FromImage(map);
  43. graph.Clear(Color.White);//清除画面,填充背景
  44. //graph.DrawRectangle(new Pen(Color.Silver, 0), 0, 0, map.Width - 1, map.Height - 1);//画一个边框
  45. Random rand = new Random();
  46. //验证码旋转,防止机器识别
  47. char[] chars = randomcode.ToCharArray();//拆散字符串成单字符数组
  48. //文字距中
  49. StringFormat format = new StringFormat(StringFormatFlags.NoClip);
  50. format.Alignment = StringAlignment.Center;
  51. format.LineAlignment = StringAlignment.Center;
  52. //定义颜色
  53. Color[] c = { Color.Black, Color.Red, Color.Blue, Color.Green,
  54. Color.Orange, Color.Brown, Color.DarkBlue };
  55. //画图片的背景噪音线
  56. for (int i = 0; i < 2; i++)
  57. {
  58. int x1 = rand.Next(10);
  59. int x2 = rand.Next(map.Width - 10, map.Width);
  60. int y1 = rand.Next(map.Height);
  61. int y2 = rand.Next(map.Height);
  62. graph.DrawLine(new Pen(c[rand.Next(7)]), x1, y1, x2, y2);
  63. }
  64. for (int i = 0; i < chars.Length; i++)
  65. {
  66. int cindex = rand.Next(7);
  67. int findex = rand.Next(5);
  68. Font f = new System.Drawing.Font("Arial", 18, System.Drawing.FontStyle.Regular);//字体样式(参数2为字体大小)
  69. Brush b = new System.Drawing.SolidBrush(c[cindex]);
  70. Point dot = new Point(12, 16);
  71. float angle = rand.Next(-randAngle, randAngle);//转动的度数
  72. graph.TranslateTransform(dot.X, dot.Y);//移动光标到指定位置
  73. graph.RotateTransform(angle);
  74. graph.DrawString(chars[i].ToString(), f, b, 1, 1, format);
  75. graph.RotateTransform(-angle);//转回去
  76. graph.TranslateTransform(2, -dot.Y);//移动光标到指定位置
  77. }
  78. //生成图片
  79. System.IO.MemoryStream ms = new System.IO.MemoryStream();
  80. MemoryStream stream = new MemoryStream();
  81. map.Save(stream, ImageFormat.Jpeg);
  82. graph.Dispose();
  83. map.Dispose();
  84. return stream.ToArray();
  85. }
  86. #endregion
  87. #region 验证码--方式2
  88. /// <summary>
  89. /// 验证码--方式2
  90. /// </summary>
  91. /// <param name="chkCode">验证码</param>
  92. /// <returns></returns>
  93. public Byte[] CreateImage2(string chkCode)
  94. {
  95. //颜色列表,用于验证码、噪线、噪点
  96. Color[] color = { Color.Black, Color.Red, Color.Blue, Color.Green, Color.Orange, Color.Brown, Color.Brown, Color.DarkBlue };
  97. //字体列表,用于验证码
  98. string[] font = { "Times New Roman", "MS Mincho", "Book Antiqua", "Gungsuh", "PMingLiU", "Impact" };
  99. Random rnd = new Random();
  100. Bitmap bmp = new Bitmap(100, 40);
  101. Graphics g = Graphics.FromImage(bmp);
  102. g.Clear(Color.White);
  103. //画噪线
  104. for (int i = 0; i < 3; i++)
  105. {
  106. int x1 = rnd.Next(100);
  107. int y1 = rnd.Next(40);
  108. int x2 = rnd.Next(100);
  109. int y2 = rnd.Next(40);
  110. Color clr = color[rnd.Next(color.Length)];
  111. g.DrawLine(new Pen(clr), x1, y1, x2, y2);
  112. }
  113. //画验证码字符串
  114. for (int i = 0; i < chkCode.Length; i++)
  115. {
  116. string fnt = font[rnd.Next(font.Length)];
  117. Font ft = new Font(fnt, 18);
  118. Color clr = color[rnd.Next(color.Length)];
  119. g.DrawString(chkCode[i].ToString(), ft, new SolidBrush(clr), (float)i * 20 + 8, (float)8);
  120. }
  121. //画噪点
  122. for (int i = 0; i < 20; i++)
  123. {
  124. int x = rnd.Next(bmp.Width);
  125. int y = rnd.Next(bmp.Height);
  126. Color clr = color[rnd.Next(color.Length)];
  127. bmp.SetPixel(x, y, clr);
  128. }
  129. MemoryStream ms = new MemoryStream();
  130. try
  131. {
  132. bmp.Save(ms, ImageFormat.Png);
  133. return ms.ToArray();
  134. }
  135. finally
  136. {
  137. //显式释放资源
  138. bmp.Dispose();
  139. g.Dispose();
  140. }
  141. }
  142. #endregion
  143. }
  144. }

然后需要在控制器中实现访问的方式(其实就是写一个action,把生成的image文件返回给view)

  1. /// <summary>
  2. /// 验证码,形状一
  3. /// </summary>
  4. /// <returns></returns>
  5. public ActionResult Yzm()
  6. {
  7. TyMall.Util.Yzm sc = new TyMall.Util.Yzm();
  8. string vVerificationCode = sc.RandCode();
  9. Session["vcode"] = null;
  10. Session("vcode", vVerificationCode.ToLower());   //Session中保存验证码
  11. sc.CreateImage(vVerificationCode);
  12. return File(sc.CreateImage(vVerificationCode), @"image/jpeg");
  13. }
  14. /// <summary>
  15. ///验证码,形状二
  16. /// </summary>
  17. /// <returns></returns>
  18. public ActionResult Yzm2()
  19. {
  20. TyMall.Util.Yzm sc = new TyMall.Util.Yzm();
  21. string vVerificationCode = sc.RandCode();
  22. Session["vcode"] = null;
  23. Session("vcode", vVerificationCode.ToLower());   //Session中保存验证码
  24. sc.CreateImage(vVerificationCode);
  25. return File(sc.CreateImage2(vVerificationCode), @"image/jpeg");
  26. }

view中访问方式(就是image的最原始展示方式)

    1. <img id="yzm" src="/控制器名称/yzm" />
    2. <img id="yzm" src="/控制器名称/yzm2" />

一个MVC4 下的验证码用法的更多相关文章

  1. ASP.NET Web API实践系列02,在MVC4下的一个实例, 包含EF Code First,依赖注入, Bootstrap等

    本篇体验在MVC4下,实现一个对Book信息的管理,包括增删查等,用到了EF Code First, 使用Unity进行依赖注入,前端使用Bootstrap美化.先上最终效果: →创建一个MVC4项目 ...

  2. xss其他标签下的js用法总结大全

    前段时间我遇到一个问题,就是说普通的平台获取cookie的语句为↓           Default <script src=js地址></script> 1 <scr ...

  3. 快速入门系列--WebAPI--04在老版本MVC4下的调整

    WebAPI是建立在MVC和WCF的基础上的,原来微软老是喜欢封装的很多,这次终于愿意将http编程模型的相关细节暴露给我们了.在之前的介绍中,基本上都基于.NET 4.5之后版本,其System.N ...

  4. 一个CSS中Z-index的用法

    一个CSS中Z-index的用法 CSS教程:彻底掌握Z-index属性     大多数的CSS属性都很容易使用.常常,当您对标记语言的元素使用CSS属性时,产生的结果会随着您刷新页面而立即呈现.而另 ...

  5. ava下static关键字用法详解

    Java下static关键字用法详解 本文章介绍了java下static关键字的用法,大部分内容摘自原作者,在此学习并分享给大家. Static关键字可以修饰什么? 从以下测试可以看出, static ...

  6. 一个漂亮的php验证码类

    一个漂亮的php验证码类(分享)   作者: 字体:[增加 减小] 类型:转载 下面小编就为大家分享一个漂亮的php验证码类.需要的朋友可以过来参考下   直接上代码: 复制代码 代码如下: //验证 ...

  7. StringBuilder在高性能场景下的正确用法

    转载:<StringBuilder在高性能场景下的正确用法> by 江南白衣 关于StringBuilder,一般同学只简单记住了,字符串拼接要用StringBuilder,不要用+,也不 ...

  8. select into tb_temp2 from tb_temp1 创建临时表实现上一个、下一个功能,使用完毕就删除临时表

    好久没有写过Sql了,今天遇到一个问题,业务逻辑是: 一个商品可以属于多个分类,在显示商品详情的时候,要求可以点击“上一个”,“下一个” 查看和该商品在同一个分类下的其他商品,商品具有排序号. 这样我 ...

  9. centos 7 下图形验证码乱码

    工作中遇到一个问题:同样的代码在centos 6.5下图形验证码是正常的 但是在centos 7下面是乱码 centos 6.5 的系统字体库目录 [wwwad@P2P-test2 fonts]$ p ...

随机推荐

  1. linux性能分析工具集(图示)

  2. Is there anyway to discover which ip addresses are connected to the db?

    From mongo shell run db.currentOp() to show all active connections or db.currentOp(true) to show all ...

  3. (转)No row with the given identifier exists问题的解决

    产生此问题的原因:         有两张表,table1和table2.产生此问题的原因就是table1里做了关联<one-to-one>或者<many-to-one unique ...

  4. easyui tree loader用法

    easyui的tree每次都展开,在获取子节点,自定义参数解决方案,兄跌是不是找很久了! 直接上代码 //重写tree的loader $.extend($.fn.tree.defaults, { lo ...

  5. FastDFS_v4.06+nginx-1.4.2配置详解

    径不带group名(storage只有一个group的情况),如/M00/00/00/xxx:       location /M00 {            ngx_fastdfs_module; ...

  6. 微信小程序 - 接口更新记录以及解决方案(2018/12/26)

    2018/8/17 - 背景音频需要在app.json添加requireBackGroundModes 2018/9/12 - 微信更改获取用户信息接口/获取位置等接口 - button 2018/1 ...

  7. POSTGRESQL 自动登录

    以前习惯使用MYSQL命令行登录,但是到POSTGRESQL不能实现,下面总结一下方法: 1.填写需要链接的postgresql语句,一般放在~/.bash_profile,例如: alias log ...

  8. spring boot-mybatis三种动态sql(5)

    脚本sql XML配置方式的动态SQL我就不讲了,有兴趣可以自己了解,下面是用<script>的方式把它照搬过来,用注解来实现.适用于xml配置转换到注解配置 @Select(" ...

  9. java相关知识集锦

    java语言基础知识: Java8 Stream语法详解 不用循环 java 8系列之Stream的基本语法详解 java8 stream filter等功能代替for Java中try catch ...

  10. excel自定义数据验证

    1. 判断必须为5位或者9位的数字 2. 自定义限制级别和提示消息