首先,在项目模型(Model)层中建立一个生成图片验证码的类ValidationCodeHelper,代码如下:

 public class ValidationCodeHelper
{
//用户存取验证码字符串
public string validationCode = String.Empty;
Random ram = new Random();
Graphics g = null; int bgWidth = ;
int bgHeight = ; public string FontFace = "Consolas";
public int FontSize = ;
public Color foreColor = Color.FromArgb(, , );
public Color backColor = Color.FromArgb(, , );
public Color mixedLineColor = Color.FromArgb(, , );
public int mixedLineWidth = ;
public int mixedLineCount = ; #region 根据指定长度,返回随机验证码
/// <summary>
/// 根据指定长度,返回随机验证码
/// </summary>
/// <param name="length">制定长度</param>
/// <returns>随即验证码</returns>
public string Next(int length)
{
this.validationCode = GetRandomCode(length);
return this.validationCode;
}
#endregion #region 根据指定长度及背景图片样式,返回带有随机验证码的图片对象
/// <summary>
/// 根据指定长度及背景图片样式,返回带有随机验证码的图片对象
/// </summary>
/// <param name="length">指定长度</param>
/// <param name="hatchStyle">背景图片样式</param>
/// <returns>Image对象</returns>
public Image NextImage(int length, bool allowMixedLines,out string code)
{
this.validationCode = GetRandomCode(length);
code = this.validationCode;
//System.Web.HttpContext.Current.Session["Code"] = validationCode;
//校验码字体
Font myFont = new Font(FontFace, FontSize); //根据校验码字体大小算出背景大小
bgWidth = (int)myFont.Size * length + ;
bgHeight = (int)myFont.Size * ;
//生成背景图片
Bitmap myBitmap = new Bitmap(bgWidth, bgHeight); g = Graphics.FromImage(myBitmap); this.DrawBackground();
this.DrawValidationCode(this.validationCode, myFont);
if (allowMixedLines)
this.DrawMixedLine(); return (Image)myBitmap;
}
#endregion #region 内部方法:绘制验证码背景
private void DrawBackground( )
{
//设置填充背景时用的笔刷
HatchBrush hBrush = new HatchBrush(HatchStyle.Wave, backColor); //填充背景图片
g.FillRectangle(hBrush, , , this.bgWidth, this.bgHeight);
}
#endregion #region 内部方法:绘制验证码
private void DrawValidationCode(string vCode, Font font)
{
g.DrawString(vCode, font, new SolidBrush(this.foreColor), , );
}
#endregion #region 内部方法:绘制干扰线条
/// <summary>
/// 绘制干扰线条
/// </summary>
private void DrawMixedLine()
{
for (int i = ; i < mixedLineCount; i++)
{
g.DrawBezier(
new Pen(new SolidBrush(mixedLineColor),mixedLineWidth),
RandomPoint(),
RandomPoint(),
RandomPoint(),
RandomPoint()
);
}
}
#endregion #region 内部方法:返回指定长度的随机验证码字符串
/// <summary>
/// 根据指定大小返回随机验证码
/// </summary>
/// <param name="length">字符串长度</param>
/// <returns>随机字符串</returns>
private string GetRandomCode(int length)
{
StringBuilder sb = new StringBuilder(); for (int i = ; i < length; i++)
{
sb.Append(Char.ConvertFromUtf32(RandomAZ09()));
} return sb.ToString();
}
#endregion #region 内部方法:产生随机数和随机点 /// <summary>
/// 产生0-9A-Z的随机字符代码
/// </summary>
/// <returns>字符代码</returns>
private int RandomAZ09()
{
//Thread.Sleep(15);
int result = ; int i = ram.Next(); switch (i)
{
case :
result = ram.Next(, );
break;
case :
result = ram.Next(, );
break;
} return result;
} /// <summary>
/// 返回一个随机点,该随机点范围在验证码背景大小范围内
/// </summary>
/// <returns>Point对象</returns>
private Point RandomPoint()
{
//Thread.Sleep(15); Point point = new Point(ram.Next(this.bgWidth), ram.Next(this.bgHeight));
return point;
}
#endregion
}

然后,在控制器(Controller)中创建一个控制器名称为ValidateCodeImgController的.cs文件,写入以下方法。

这个方法用来返回一个图像对象:

        public ActionResult Get()
{
ValidationCodeHelper vCode = new ValidationCodeHelper();
string code;
Image imgcode = vCode.NextImage(,true,out code); //设置临时数据字典进行储存
this.TempData["Code"] = code; //创建存储区为内存的流(关闭程序后,数据会被自动回收)
MemoryStream ms = new MemoryStream(); //将此图像以指定的格式保存到指定的流中
imgcode.Save(ms,ImageFormat.Gif); this.Response.ContentType = "image/gif";
this.Response.BinaryWrite(ms.ToArray());
ms.Close();
imgcode.Dispose(); return new EmptyResult();
}

最后,视图(View)中显示:

js代码:

<script type="text/javascript">
function imgCodes() {
$("#valiCode").attr("src", '@Url.Action("Get", "ValidateCodeImg")'+"?time="+(new Date()).getTime());
}
</script>

html代码:

<td height="" class="login-text02">
验证码:<br />
</td>
<td>
<div style="width:400px;">
<input type="text" name="txtCheck" />&nbsp;&nbsp;&nbsp;
<img id="valiCode" style="cursor: pointer;" src="/ValidateCodeImg/Get" title="看不清,点击换一张" alt="看不清?请点我" onclick="imgCodes(this);" />
&nbsp;&nbsp;
<a href="javascript:imgCodes();">看不清楚,点击这里</a> </div>
</td>

显示效果如下图:

注意:根据这段html代码,刷新图片验证码,可以直接点击验证码图片也可以点击a标签。

在mvc中实现图片验证码的刷新的更多相关文章

  1. Spring mvc 中使用 kaptcha 验证码

    生成验证码的方式有很多,个人认为较为灵活方便的是Kaptcha ,他是基于SimpleCaptcha的开源项目.使用Kaptcha 生成验证码十分简单并且参数可以进行自定义.只需添加jar包配置下就可 ...

  2. django项目登录中使用图片验证码

    应用下创建untils文件夹放置封装图片验证码的函数 创建validCode.py文件定义验证码规则 import random def get_random_color(): return (ran ...

  3. Struts2中的图片验证码

    1.Struts中建一个action <action name="Code" class="LoginAction" method="code& ...

  4. MVC伪一个12306图片验证码

    本文的来由主要是满足自己的好奇心,而不是证明什么东西,如果涉及到什么官方性的事情,麻烦通知我谢谢:本篇将要和大家分享的是一个看起来通12306图片验证码相似的效果,这篇应该是今年农历最后一篇分享文章了 ...

  5. ASP.NET图片验证码

    1. 新建一个Validate.aspx,然后在Validate.aspx.cs编写代码: using System; using System.Collections; using System.C ...

  6. ASP.NET图片验证码学习!

    1. 新建一个Validate.aspx,然后在Validate.aspx.cs编写代码: using System; using System.Collections; using System.C ...

  7. Django实战(一)-----用户登录与注册系统5(图片验证码)

    为了防止机器人频繁登录网站或者破坏分子恶意登录,很多用户登录和注册系统都提供了图形验证码功能. 验证码(CAPTCHA)是一种区分用户是计算机还是人的公共全自动程序. 可以防止恶意破解密码.刷票.论坛 ...

  8. Django商城项目笔记No.4用户部分-注册接口-图片验证码

    Django商城项目笔记No.4用户部分-注册接口-图片验证码 1.首先分析注册业务接口 1.1.分析可得,至少这么几个接口 图片验证码 短信验证码 用户名是否存在 手机号是否存在 整体注册接口 图片 ...

  9. linux下tomcat6无法显示图片验证码 少了图形插件

    linux下tomcat6无法显示图片验证码(windows下显示正常) 原创 2015年10月20日 10:31:47 3526 linux下tomcat6无法显示图片验证码(windows下显示正 ...

随机推荐

  1. nginx实现本地图片生成缩略图

    nginx可以实现图片的缩略图效果,很多网站为了前端静态资源相应的性能会给大图自动生成一个小图,比如我们经常会在网上看到bd_64x64.png这种格式,淘宝上的小图经常会看到xxx.jpg_100x ...

  2. ABAP 上传文件到内表

    http://www.cnblogs.com/jiangzhengjun/p/4265642.html http://www.xuebuyuan.com/1233478.html

  3. iOS 查询数组中的对象

    简述:Cocoa框架中的NSPredicate用于查询,原理和用法都类似于SQL中的where,作用相当于数据库的过滤取. 定义(最常用到的方法): NSPredicate *ca = [NSPred ...

  4. c语言for循环

    #include<stdio.h>#include<windows.h>#include <limits.h>#include <math.h>void ...

  5. 大公司的PHP面试题

    1. 禁用COOKIE 后 SEESION 还能用吗? 2. 抓取远程图片到本地,你会用什么函数? 4. 你觉得在pV10W的时候, 同等配置下,LUNIX 比WIN快多少? 5. 简述pOST 和G ...

  6. 水晶报表初体验(Visual Studio 2010)

    安装水晶报表后如下使用: 配置rpt文件,如图 前台(Asp.net页面): <%@ Register Assembly="CrystalDecisions.Web, Version= ...

  7. linux学习笔记-(1)-安装

    学习的第一部,当然是寻找学习资料,如今的网络如此发达,只要下点功夫,基本上能在网上找到一切自己所需要的东西,而且还是免费滴哟! ---------------------分割线------------ ...

  8. Java知识点归总一之堆栈

    Java栈与堆 (一天一个知识点2014-07-28) ----对这两个概念的不明好久,终于找到一篇好文,拿来共享 1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C ...

  9. Angular过滤器

    angular中的过滤器有: currency 过滤货币 number  过滤数字, date  过滤日期 json 把js对象过滤为json字符串 limitTo  截取字符串,参数是正数则从左往右 ...

  10. 设置 tableview 的背景颜色,总是有蒙层

    1.给tableview添加了背景图片后, cell 总是有一层蒙层蒙着,很阴暗. 2.实验以后才发现背景图片被放在了 cell 的后面.