1.创建一个验证类,里面有生成验证码的两个方法。

namespace YTJWGL_Common
{
public class ValidatorCodeTools
{
#region 生成校验码图片
public ValidatorCodeTools()
{
}
/// <summary>
/// 验证码的最大长度
/// </summary>
public int MaxLength
{
get { return ; }
}
/// <summary>
/// 验证码的最小长度
/// </summary>
public int MinLength
{
get { return ; }
}
/// <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(, Int32.MaxValue - length * );
int[] seeks = new int[length];
for (int i = ; i < length; i++)
{
beginSeek += ;
seeks[i] = beginSeek;
}
//生成随机数字
for (int i = ; i < length; i++)
{
Random rand = new Random(seeks[i]);
int pownum = * (int)Math.Pow(, length);
randMembers[i] = rand.Next(pownum, Int32.MaxValue);
}
//抽取随机数字
for (int i = ; i < length; i++)
{
string numStr = randMembers[i].ToString();
int numLength = numStr.Length;
Random rand = new Random();
int numPosition = rand.Next(, numLength - );
validateNums[i] = Int32.Parse(numStr.Substring(numPosition, ));
}
//生成验证码
for (int i = ; i < length; i++)
{
validateNumberStr += validateNums[i].ToString();
}
return validateNumberStr;
}
/// <summary>
/// 创建验证码的图片
/// </summary>
/// <param name="validateCode">验证码内容</param>
/// <returns></returns>
public byte[] CreateValidateGraphic(string validateCode)
{
Bitmap image = new Bitmap((int)Math.Ceiling(validateCode.Length * 12.0), );
Graphics g = Graphics.FromImage(image);
try
{
//生成随机生成器
Random random = new Random();
//清空图片背景色
g.Clear(Color.White);
//画图片的干扰线
for (int i = ; i < ; 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", , (FontStyle.Bold | FontStyle.Italic));
LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(, , image.Width, image.Height),
Color.Blue, Color.DarkRed, 1.2f, true);
g.DrawString(validateCode, font, brush, , );
//画图片的前景干扰点
for (int i = ; i < ; 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), , , image.Width - , image.Height - );
//保存图片数据
MemoryStream stream = new MemoryStream();
image.Save(stream, ImageFormat.Jpeg);
//输出图片流
return 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;
}
#endregion
}
}

2.CreateValidateCode方法生成验证码内容,对应图片中的形如“54361”这样的数字。而CreateValidateGraphic该方法接收一个参数,把参数中的验证码转换为图片显示。在BLL层有两个方法:

namespace YTJWGL_Bll
{
public class AdminService : BaseService<YTJWGL_Admin>, IAdminService
{ /// <summary>
/// 生成验证码数字
/// </summary>
/// <param name="id">验证码位数,默认为5</param>
/// <returns></returns>
public string NewValidateCode(int id = )
{
ValidatorCodeTools obj = new ValidatorCodeTools();
return obj.CreateValidateCode();
}
/// <summary>
/// 验证码图片
/// </summary>
/// <param name="code"></param>
/// <returns></returns>
public byte[] NewValidateCodeGraphic(string code)
{
ValidatorCodeTools obj = new ValidatorCodeTools();
return obj.CreateValidateGraphic(code);
}
}
}

3.新建一个Action:

namespace YTJWGL_WebUI.Areas.Admin.Controllers
{ public class FrameController : Controller
{
//
// GET: /Admin/Frame/
#region Fields private readonly IAdminService _adminService;
private readonly IAdminAuthorityService _adminAuthorityService;
private readonly IAdminRoleService _adminRoleService;
private readonly ILogService _logService; #endregion #region Constructors public FrameController(IAdminService adminService, IAdminAuthorityService adminAuthorityService, IAdminRoleService adminRoleService, ILogService logService)
{
this._adminService = adminService;
this._adminAuthorityService = adminAuthorityService;
this._adminRoleService = adminRoleService;
this._logService = logService;
}
#endregion #region Admin public ActionResult GetValidatorGraphics()
{
string code = _adminService.NewValidateCode();
Session["ValidatorCode"] = code;
byte[] graphic = _adminService.NewValidateCodeGraphic(code);
return File(graphic, @"image/jpeg");
}
#endregion
}
}

在Action中调用我们刚才在BLL层定义 的两个方法,返回这张验证码图片。因为http是无连接的,这个action仅仅响应用户一次访问请求,当用户点击登录后会将填写的验证码发送到服务器, 而这已经是第二次访问请求了,所以需要用Session用来保存刚才发往客户端的验证码。

  那么,怎么在界面上请求这张验证码图片呢?

4.只需要使用<img>标签的src属性访问我们刚才的action。生成的效果如下:

<script type="text/javascript">
//当点击图片时,刷新验证码
$(function () {
$("#valiCode").bind("click", function () {
this.src = "@Url.Action("GetValidatorGraphics", "Frame")?time=" + (new Date()).getTime();
});
});
</script>

5.给img标签添加click事件,点击过后重新访问生成验证码的action,由于验证中数字是随机生成的,新返回的验证码图片就不一样了。避免浏览器缓存影响,src链接附件了一个随机时间。

MVC图片验证的更多相关文章

  1. ASP.NET MVC 5 - 验证编辑方法(Edit method)和编辑视图(Edit view)

    在本节中,您将验证电影控制器生成的编辑方法(Edit action methods)和视图.但是首先将修改点代码,使得发布日期属性(ReleaseDate)看上去更好.打开Models \ Movie ...

  2. MVC 图片上传 带进度条(转)

    MVC 图片上传小试笔记 form.js 这个插件已经是很有名的,结合MVC的html辅助方法异步上传就很简单了.jQuery Form Plugin :http://www.malsup.com/j ...

  3. MVC图片上传、浏览、删除 ASP.NET MVC之文件上传【一】(八) ASP.NET MVC 图片上传到服务器

    MVC图片上传.浏览.删除   1.存储配置信息 在web.config中,添加配置信息节点 <appSettings> <add key="UploadPath" ...

  4. [转]ASP.NET MVC 5 - 验证编辑方法(Edit method)和编辑视图(Edit view)

    在本节中,您将验证电影控制器生成的编辑方法(Edit action methods)和视图.但是首先将修改点代码,使得发布日期属性(ReleaseDate)看上去更好.打开Models \ Movie ...

  5. MVC的验证(模型注解和非侵入式脚本的结合使用) .Net中初探Redis .net通过代码发送邮件 Log4net (Log for .net) 使用GDI技术创建ASP.NET验证码 Razor模板引擎 (RazorEngine) .Net程序员应该掌握的正则表达式

    MVC的验证(模型注解和非侵入式脚本的结合使用)   @HtmlHrlper方式创建的标签,会自动生成一些属性,其中一些属性就是关于验证 如图示例: 模型注解 通过模型注解后,MVC的验证,包括前台客 ...

  6. ASP.NET MVC Model验证(五)

    ASP.NET MVC Model验证(五) 前言 上篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现, 然而在MVC框架中还给我们提供了其它 ...

  7. ASP.NET MVC Model验证(四)

    ASP.NET MVC Model验证(四) 前言 本篇主要讲解ModelValidatorProvider 和ModelValidator两种类型的自定义实现,前者是Model验证提供程序,而Mod ...

  8. ASP.NET MVC Model验证(三)

    ASP.NET MVC Model验证(三) 前言 上篇中说到在MVC框架中默认的Model验证是在哪里验证的,还讲到DefaultModelBinder类型的内部执行的示意图,让大家可以看到默认的M ...

  9. ASP.NET MVC Model验证(二)

    ASP.NET MVC Model验证(二) 前言 上篇内容演示了一个简单的Model验证示例,然后在文中提及到Model验证在MVC框架中默认所处的位置在哪?本篇就是来解决这个问题的,并且会描述一下 ...

随机推荐

  1. map reduce 用法 str处理lower() capitalize()

    -- s=' l={':9}[s[0]] print(l) 取出dic里面key的元素 def normalize(name): tempn=name.lower().capitalize() ret ...

  2. Delphi,C语言互通脚本引擎研究

    基于大神akuma的脚本引擎. 下面是demo

  3. Java JMX 监管

    Java JMX 监管 JSR 规范系列目录(https://www.cnblogs.com/binarylei/p/10348178.html) JMX(Java Management Extens ...

  4. sql条件查询-日期比较(取年月部分)

    查询当年当月的数据: select * from compalete_task where to_Char(create_date,'yyyyMM') = to_Char(sysdate,'yyyyM ...

  5. 155. Min Stack - Unsolved

    https://leetcode.com/problems/min-stack/#/solutions Design a stack that supports push, pop, top, and ...

  6. ManageEngine卓豪 IT管理峰会圆满结束

  7. 泛型c#(深入理解c#)

    1.泛型带来的好处非常像静态语言较之动态语言的优点:更好的编译时检查,更多在代码中能直接表现的信息,更多的IDE支持,更好的性能.泛型的好处之一就是在编译时执行更多的检查,所以等到编译不在报错时,就极 ...

  8. kbmmw 5.02发布

    5.02.00 May 27 2017 Important notes (changes that may break existing code) ========================= ...

  9. i2c总线,核心,驱动详解

    Linux I2C驱动分析(一)----I2C架构和总线驱动 一.I2C总线原理 I2C是一种常用的串行总线,由串行数据线SDA 和串线时钟线SCL组成.I2C是一种多主机控制总线,它和USB总线不同 ...

  10. ubuntu 设置DNS

    sudo vi /etc/resolv.conf #加入nameserver 114.114.114.114