一个MVC4 下的验证码用法
先看一个核心验证码类(不用在意实现过程,直接copy就行),下面包含了两种验证码图片(原理一样),代码如下:
- using System;
- using System.Collections.Generic;
- using System.Drawing;
- using System.Web;
- using System.Web.UI;
- using System.Web.UI.WebControls;
- using System.IO;
- using System.Drawing.Imaging;
- namespace TyMall.Util
- {
- public class Yzm : System.Web.UI.Page
- {
- #region 生成4个随机数
- public string RandCode()
- {
- int CodeCount = 4;//生成4个随机数
- 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";
- randomChar = randomChar.Replace(",", "");
- string RandomCode = "";
- System.Threading.Thread.Sleep(3);
- char[] allCharArray = randomChar.ToCharArray();
- int n = allCharArray.Length;
- System.Random random = new Random(~unchecked((int)DateTime.Now.Ticks));
- for (int i = 0; i < CodeCount; i++)
- {
- int rnd = random.Next(0, n);
- RandomCode += allCharArray[rnd];
- }
- return RandomCode;
- }
- #endregion
- #region 验证码--方式1
- /// <summary>
- /// 验证码--方式1 创建验证码图片
- /// </summary>
- /// <param name="randomcode">验证码</param>
- public byte[] CreateImage(string randomcode)
- {
- int randAngle = 40; //随机转动角度
- int mapwidth = (int)(randomcode.Length * 18);
- Bitmap map = new Bitmap(mapwidth, 24);//创建图片背景
- Graphics graph = Graphics.FromImage(map);
- graph.Clear(Color.White);//清除画面,填充背景
- //graph.DrawRectangle(new Pen(Color.Silver, 0), 0, 0, map.Width - 1, map.Height - 1);//画一个边框
- Random rand = new Random();
- //验证码旋转,防止机器识别
- char[] chars = randomcode.ToCharArray();//拆散字符串成单字符数组
- //文字距中
- StringFormat format = new StringFormat(StringFormatFlags.NoClip);
- format.Alignment = StringAlignment.Center;
- format.LineAlignment = StringAlignment.Center;
- //定义颜色
- Color[] c = { Color.Black, Color.Red, Color.Blue, Color.Green,
- Color.Orange, Color.Brown, Color.DarkBlue };
- //画图片的背景噪音线
- for (int i = 0; i < 2; i++)
- {
- int x1 = rand.Next(10);
- int x2 = rand.Next(map.Width - 10, map.Width);
- int y1 = rand.Next(map.Height);
- int y2 = rand.Next(map.Height);
- graph.DrawLine(new Pen(c[rand.Next(7)]), x1, y1, x2, y2);
- }
- for (int i = 0; i < chars.Length; i++)
- {
- int cindex = rand.Next(7);
- int findex = rand.Next(5);
- Font f = new System.Drawing.Font("Arial", 18, System.Drawing.FontStyle.Regular);//字体样式(参数2为字体大小)
- Brush b = new System.Drawing.SolidBrush(c[cindex]);
- Point dot = new Point(12, 16);
- float angle = rand.Next(-randAngle, randAngle);//转动的度数
- graph.TranslateTransform(dot.X, dot.Y);//移动光标到指定位置
- graph.RotateTransform(angle);
- graph.DrawString(chars[i].ToString(), f, b, 1, 1, format);
- graph.RotateTransform(-angle);//转回去
- graph.TranslateTransform(2, -dot.Y);//移动光标到指定位置
- }
- //生成图片
- System.IO.MemoryStream ms = new System.IO.MemoryStream();
- MemoryStream stream = new MemoryStream();
- map.Save(stream, ImageFormat.Jpeg);
- graph.Dispose();
- map.Dispose();
- return stream.ToArray();
- }
- #endregion
- #region 验证码--方式2
- /// <summary>
- /// 验证码--方式2
- /// </summary>
- /// <param name="chkCode">验证码</param>
- /// <returns></returns>
- public Byte[] CreateImage2(string chkCode)
- {
- //颜色列表,用于验证码、噪线、噪点
- Color[] color = { Color.Black, Color.Red, Color.Blue, Color.Green, Color.Orange, Color.Brown, Color.Brown, Color.DarkBlue };
- //字体列表,用于验证码
- string[] font = { "Times New Roman", "MS Mincho", "Book Antiqua", "Gungsuh", "PMingLiU", "Impact" };
- Random rnd = new Random();
- Bitmap bmp = new Bitmap(100, 40);
- Graphics g = Graphics.FromImage(bmp);
- g.Clear(Color.White);
- //画噪线
- for (int i = 0; i < 3; i++)
- {
- int x1 = rnd.Next(100);
- int y1 = rnd.Next(40);
- int x2 = rnd.Next(100);
- int y2 = rnd.Next(40);
- Color clr = color[rnd.Next(color.Length)];
- g.DrawLine(new Pen(clr), x1, y1, x2, y2);
- }
- //画验证码字符串
- for (int i = 0; i < chkCode.Length; i++)
- {
- string fnt = font[rnd.Next(font.Length)];
- Font ft = new Font(fnt, 18);
- Color clr = color[rnd.Next(color.Length)];
- g.DrawString(chkCode[i].ToString(), ft, new SolidBrush(clr), (float)i * 20 + 8, (float)8);
- }
- //画噪点
- for (int i = 0; i < 20; i++)
- {
- int x = rnd.Next(bmp.Width);
- int y = rnd.Next(bmp.Height);
- Color clr = color[rnd.Next(color.Length)];
- bmp.SetPixel(x, y, clr);
- }
- MemoryStream ms = new MemoryStream();
- try
- {
- bmp.Save(ms, ImageFormat.Png);
- return ms.ToArray();
- }
- finally
- {
- //显式释放资源
- bmp.Dispose();
- g.Dispose();
- }
- }
- #endregion
- }
- }
然后需要在控制器中实现访问的方式(其实就是写一个action,把生成的image文件返回给view)
- /// <summary>
- /// 验证码,形状一
- /// </summary>
- /// <returns></returns>
- public ActionResult Yzm()
- {
- TyMall.Util.Yzm sc = new TyMall.Util.Yzm();
- string vVerificationCode = sc.RandCode();
- Session["vcode"] = null;
- Session("vcode", vVerificationCode.ToLower()); //Session中保存验证码
- sc.CreateImage(vVerificationCode);
- return File(sc.CreateImage(vVerificationCode), @"image/jpeg");
- }
- /// <summary>
- ///验证码,形状二
- /// </summary>
- /// <returns></returns>
- public ActionResult Yzm2()
- {
- TyMall.Util.Yzm sc = new TyMall.Util.Yzm();
- string vVerificationCode = sc.RandCode();
- Session["vcode"] = null;
- Session("vcode", vVerificationCode.ToLower()); //Session中保存验证码
- sc.CreateImage(vVerificationCode);
- return File(sc.CreateImage2(vVerificationCode), @"image/jpeg");
- }
view中访问方式(就是image的最原始展示方式)
- <img id="yzm" src="/控制器名称/yzm" />
- <img id="yzm" src="/控制器名称/yzm2" />
一个MVC4 下的验证码用法的更多相关文章
- ASP.NET Web API实践系列02,在MVC4下的一个实例, 包含EF Code First,依赖注入, Bootstrap等
本篇体验在MVC4下,实现一个对Book信息的管理,包括增删查等,用到了EF Code First, 使用Unity进行依赖注入,前端使用Bootstrap美化.先上最终效果: →创建一个MVC4项目 ...
- xss其他标签下的js用法总结大全
前段时间我遇到一个问题,就是说普通的平台获取cookie的语句为↓ Default <script src=js地址></script> 1 <scr ...
- 快速入门系列--WebAPI--04在老版本MVC4下的调整
WebAPI是建立在MVC和WCF的基础上的,原来微软老是喜欢封装的很多,这次终于愿意将http编程模型的相关细节暴露给我们了.在之前的介绍中,基本上都基于.NET 4.5之后版本,其System.N ...
- 一个CSS中Z-index的用法
一个CSS中Z-index的用法 CSS教程:彻底掌握Z-index属性 大多数的CSS属性都很容易使用.常常,当您对标记语言的元素使用CSS属性时,产生的结果会随着您刷新页面而立即呈现.而另 ...
- ava下static关键字用法详解
Java下static关键字用法详解 本文章介绍了java下static关键字的用法,大部分内容摘自原作者,在此学习并分享给大家. Static关键字可以修饰什么? 从以下测试可以看出, static ...
- 一个漂亮的php验证码类
一个漂亮的php验证码类(分享) 作者: 字体:[增加 减小] 类型:转载 下面小编就为大家分享一个漂亮的php验证码类.需要的朋友可以过来参考下 直接上代码: 复制代码 代码如下: //验证 ...
- StringBuilder在高性能场景下的正确用法
转载:<StringBuilder在高性能场景下的正确用法> by 江南白衣 关于StringBuilder,一般同学只简单记住了,字符串拼接要用StringBuilder,不要用+,也不 ...
- select into tb_temp2 from tb_temp1 创建临时表实现上一个、下一个功能,使用完毕就删除临时表
好久没有写过Sql了,今天遇到一个问题,业务逻辑是: 一个商品可以属于多个分类,在显示商品详情的时候,要求可以点击“上一个”,“下一个” 查看和该商品在同一个分类下的其他商品,商品具有排序号. 这样我 ...
- centos 7 下图形验证码乱码
工作中遇到一个问题:同样的代码在centos 6.5下图形验证码是正常的 但是在centos 7下面是乱码 centos 6.5 的系统字体库目录 [wwwad@P2P-test2 fonts]$ p ...
随机推荐
- lvs 隧道模式请求没有回应的解决
众所周知,lvs共有三种转发机制:NAT,IPTUNNELING与DIRECT ROUTING 我在做隧道模式实验时遇到了一个问题,客户端向虚拟ip(即隧道0的ip)发送请求后,lvs服务器接收到了请 ...
- 【nodejs】理想论坛帖子下载爬虫1.07 使用request模块后稳定多了
在1.06版本时,访问网页采用的时http.request,但调用次数多以后就问题来了. 寻找别的方案时看到了https://cnodejs.org/topic/53142ef833dbcb076d0 ...
- Android 开源项目 eoe 社区 Android 客户端
本文内容 环境 开源项目 eoe 社区 Android 客户端 本文介绍 eoe 社区 Android 客户端.它是一个开源项目,功能相对简单,采用侧边菜单栏.可以学习一下.点击此处查看 GitHub ...
- 【自动化测试】基于IntelliJ IDEA的Gradle和testNG
这几篇文章值得一读: TestNG测试框架使用笔记:http://www.cnblogs.com/xguo/p/3300358.html TestNg官方文档:http://testng.org/do ...
- poj2689 Prime Distance 有难度 埃拉托斯尼斯筛法的运用
我承认这道很难(对我来说),搞脑子啊,搞了好久,数论刚开始没多久,还不是很强大,思路有点死,主要是我 天赋太差,太菜了,希望多做做有所改善 开始解析: 首先要将在 [ l,u]内的所有素数找出来,还好 ...
- linux CPU占用率高(转)
来自:http://www.cnitblog.com/houcy/archive/2012/11/28/86801.html 1.用top命令查看哪个进程占用CPU高 gateway网关进程14094 ...
- Postgresql学习笔记
一:数据类型 主要有三大类以及其他一些杂项类型: 数值型.字符型.日期型. 数值型: 名称 描述 存储大小 范围 smallint 存储整数,小范围 2字节 -32768 至 +32767 integ ...
- 如何捕获 System.loadLibrary 产生的异常?(转)
如何捕获 System.loadLibrary 产生的异常? 当使用以下代码时,会发现异常处理的代码根本不会被执行: try{ System.loadLibrary("SimpleAuthe ...
- JqGrid把数据行插入指定位置的方法addRowData
1.首页在colModel里写好方法,如下代码options.rowId是获取当前行的编号 { label: '操作', width: 60, align: 'center', formatter: ...
- ScrollView嵌套EditText联带滑动的解决的方法
本篇文章的相关内容需结合上文:从ScrollView嵌套EditText的滑动事件冲突分析触摸事件的分发机制以及TextView的简要实现和冲突的解决的方法 在说完了怎样解决ScrollView嵌套E ...