在mvc中实现图片验证码的刷新
首先,在项目模型(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" />
<img id="valiCode" style="cursor: pointer;" src="/ValidateCodeImg/Get" title="看不清,点击换一张" alt="看不清?请点我" onclick="imgCodes(this);" />
<a href="javascript:imgCodes();">看不清楚,点击这里</a> </div>
</td>
显示效果如下图:
注意:根据这段html代码,刷新图片验证码,可以直接点击验证码图片也可以点击a标签。
在mvc中实现图片验证码的刷新的更多相关文章
- Spring mvc 中使用 kaptcha 验证码
生成验证码的方式有很多,个人认为较为灵活方便的是Kaptcha ,他是基于SimpleCaptcha的开源项目.使用Kaptcha 生成验证码十分简单并且参数可以进行自定义.只需添加jar包配置下就可 ...
- django项目登录中使用图片验证码
应用下创建untils文件夹放置封装图片验证码的函数 创建validCode.py文件定义验证码规则 import random def get_random_color(): return (ran ...
- Struts2中的图片验证码
1.Struts中建一个action <action name="Code" class="LoginAction" method="code& ...
- MVC伪一个12306图片验证码
本文的来由主要是满足自己的好奇心,而不是证明什么东西,如果涉及到什么官方性的事情,麻烦通知我谢谢:本篇将要和大家分享的是一个看起来通12306图片验证码相似的效果,这篇应该是今年农历最后一篇分享文章了 ...
- ASP.NET图片验证码
1. 新建一个Validate.aspx,然后在Validate.aspx.cs编写代码: using System; using System.Collections; using System.C ...
- ASP.NET图片验证码学习!
1. 新建一个Validate.aspx,然后在Validate.aspx.cs编写代码: using System; using System.Collections; using System.C ...
- Django实战(一)-----用户登录与注册系统5(图片验证码)
为了防止机器人频繁登录网站或者破坏分子恶意登录,很多用户登录和注册系统都提供了图形验证码功能. 验证码(CAPTCHA)是一种区分用户是计算机还是人的公共全自动程序. 可以防止恶意破解密码.刷票.论坛 ...
- Django商城项目笔记No.4用户部分-注册接口-图片验证码
Django商城项目笔记No.4用户部分-注册接口-图片验证码 1.首先分析注册业务接口 1.1.分析可得,至少这么几个接口 图片验证码 短信验证码 用户名是否存在 手机号是否存在 整体注册接口 图片 ...
- linux下tomcat6无法显示图片验证码 少了图形插件
linux下tomcat6无法显示图片验证码(windows下显示正常) 原创 2015年10月20日 10:31:47 3526 linux下tomcat6无法显示图片验证码(windows下显示正 ...
随机推荐
- 【原创】js中input type=file的一些问题
1.介绍 在开发中,文件上传必不可少,input[type=file] 是常用的上传标签,但是它长得又丑.浏览的字样不能换,但是他长得到底有多丑呢.我们来看看在不同浏览器里的样子吧. <inpu ...
- .NET LINQ 数据分组
数据分组 分组指将数据放入组中以便每个组中的元素共享公共特性的操作. 方法 方法名 说明 C# 查询表达式语法 Visual Basic 查询表达式语法 更多信息 GroupBy 对共享 ...
- 【XLL 框架库函数】 TempActiveCell/TempActiveCell12
这两个函数创建 XLOPER/XLOPER12 ,包含了当前激活工作表上的单元格引用. LPXLOPER TempActiveCell(WORD row, BYTE col); LPXLOPER12 ...
- Huffman树实现_详细注释
//最优二叉树 #include <iostream> #include <iomanip> using namespace std; //定义结点类型 //[weight | ...
- 1 javascript 核心语言笔记
//所有的双斜线之后的内容都属于注释; //变量是表示值的一个符号名字; //变量是通过var 关键字声明的; var x; //声明一个变量 //值可以通过等号赋值给变量 x = 0; //现在的变 ...
- Power BI for Office 365(五)Power View第二部分
继续上一篇Power View 报表的创建, Anna觉得为每一个大类创建一张单独的报表似乎很不现实,所以她决定按照另外一种方式来设计报表,从而满足最终用户想要查看不同大类下的数据的要求. 于是Ann ...
- 关于SQLSERVER中用SQL语句查询的一些个人理解
作为一个编程菜鸟说真的很难有什么见解,也就是写给一些刚学习编程的人,希望能给他们一些帮助吧! SQLSERVER作为刚开始入门学习的数据库,SQL语句也并不算太难!说白了也就是建库,建表,建约束,对数 ...
- poj1155 TELE (树上的背包)
题目链接:http://poj.org/problem?id=1155 题意:给定一棵树,1为根结点表示电视台,有m个叶子节点表示客户,有n-m-1个中间节点表示中转站,每条树边有权值.现在要在电视台 ...
- About_PHP_数据类型&常用数组函数
PHP数据类型总结: 1:Boolean 布尔类型 返回值就是true和false 特殊情况:(1)false (2)整型0的时候 (3)空字符串/字符串“0” (4)null 以上都会被返回fals ...
- [Android]关于filed 遍历资源文件的排序问题
Field[] svgfields = R.drawable.class.getFields(); listid = new ArrayList<Integer>(); for (Fiel ...