简单C#、asp.net mvc验证码的实现
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Text;
using System.Drawing;
using System.IO;
namespace 验证码的实现.ValidateCode
{
/// <summary>
/// 验证码生成工具类
/// </summary>
///
public class ValidateCodeHelper
{
private static Random rand = new Random();
private static string code;
/// <summary>
/// 随机生成指定长度的验证码
/// </summary>
/// <param name="length"></param>
/// <returns></returns>
public static string GetCode(int length) {
string codes = "AaBbCcDdEeFfJjHhIiJjKkMmNnPpQrRSsTtUuVvWwXxYyZz0123456789";
StringBuilder sb = new StringBuilder();
for (int i = 0; i <length; i++)
{
int index=rand.Next(codes.Length);
if (sb.ToString().Contains(codes[index])) {
i--;
continue;
}
sb.Append(codes[index]);
}
code = sb.ToString();
return code;
}
/// <summary>
/// 获取随机颜色
/// </summary>
/// <returns></returns>
private static Color GetRandomColor() {
int red = rand.Next(10, 255);
int green = rand.Next(10, 255);
int blue = rand.Next(10, 255);
return Color.FromArgb(red, green, blue);
}
/// <summary>
/// 生成验证码
/// </summary>
/// <returns></returns>
public static byte[] ValidateCode(string code) {
Bitmap img = new Bitmap(100,30);
Graphics g = Graphics.FromImage(img);
g.FillRectangle(Brushes.White, 0, 0, img.Width, img.Height);
g.DrawRectangle(new Pen(Color.Black), 1, 1, img.Width-2, img.Height-2);
Brush bush = new SolidBrush(Color.SteelBlue);
g.DrawString(code, new Font("黑体", 20, FontStyle.Italic), bush, 10, 2);
Random r = new Random();
//画线条
for (int i = 0; i < 5; i++)
{
g.DrawLine(new Pen(GetRandomColor()), r.Next(img.Width), r.Next(img.Height), r.Next(img.Width), r.Next(img.Height));
}
//画躁点
for (int i = 0; i < 100; i++)
{
img.SetPixel(r.Next(img.Width), r.Next(img.Height), GetRandomColor());
}
MemoryStream ms = new MemoryStream();
img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] data = ms.GetBuffer();
g.Dispose();
ms.Close();
return data;
}
/// <summary>
/// 生成验证码
/// </summary>
/// <param name="code">验证码</param>
/// <param name="fontColor">验证码颜色</param>
/// <returns></returns>
public static byte[] ValidateCode(string code,Color fontColor) {
Bitmap img = new Bitmap(100,30);
Graphics g = Graphics.FromImage(img);
g.FillRectangle(Brushes.White,0, 0, img.Width, img.Height);
Brush bush = new SolidBrush(fontColor);
g.DrawString(code, new Font("黑体", 20, FontStyle.Italic), bush, 10, 2);
Random r = new Random();
//画线条
for (int i = 0; i < 5; i++)
{
g.DrawLine(new Pen(GetRandomColor()), r.Next(img.Width), r.Next(img.Height), r.Next(img.Width), r.Next(img.Height));
}
//画躁点
for (int i = 0; i < 100; i++)
{
img.SetPixel(r.Next(img.Width), r.Next(img.Height), GetRandomColor());
}
MemoryStream ms = new MemoryStream();
img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] data = ms.GetBuffer();
g.Dispose();
ms.Close();
return data;
}
/// <summary>
/// 生成验证码
/// </summary>
/// <param name="code">验证码</param>
/// <param name="fontColor">验证码颜色</param>
/// <param name="backgroundColor">验证码背景颜色</param>
/// <returns></returns>
public static byte[] ValidateCode(string code,Color backgroundColor, Color fontColor)
{
Bitmap img = new Bitmap(100, 30);
Graphics g = Graphics.FromImage(img);
Brush bush1 = new SolidBrush(backgroundColor);
g.FillRectangle(bush1, 0, 0, img.Width, img.Height);
Brush bush = new SolidBrush(fontColor);
g.DrawString(code, new Font("黑体", 20, FontStyle.Italic), bush, 10, 2);
Random r = new Random();
//画线条
for (int i = 0; i < 5; i++)
{
g.DrawLine(new Pen(GetRandomColor()), r.Next(img.Width), r.Next(img.Height), r.Next(img.Width), r.Next(img.Height));
}
//画躁点
for (int i = 0; i < 100; i++)
{
img.SetPixel(r.Next(img.Width), r.Next(img.Height), GetRandomColor());
}
MemoryStream ms = new MemoryStream();
img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byte[] data = ms.GetBuffer();
g.Dispose();
ms.Close();
return data;
}
/// <summary>
/// 判断验证码是否正确
/// </summary>
/// <param name="Code"></param>
/// <returns></returns>
public static bool IsValidate(string Code) {
if (string.IsNullOrEmpty(Code)||!code.ToLower().Equals(Code.ToLower())) {
return false;
}
return true;
}
}
}
在控制器中的调用
public ActionResult ValidateCode(){
//获取指定长度验证码
string code= ValidateCodeHelper.GetCode(5);
TempData["code"] = code;//存储验证码用于验证
//将验证码绘制到图片上、保存到内存流中并返回字节数组
byte[] data= ValidateCodeHelper.ValidateCode(code);
return File(data,"image/jpeg");
}
在前端的调用
<script>
function change() {
var img = document.getElementsByTagName('img')[0];
img.src = img.src + "?";
}
</script>
<form method="post" action="/Home/Login">
<table>
<tr>
<td>验证码:</td>
<td><img src="/Home/ValidateCode" style="cursor:pointer" onclick="this.src =this.src+'?'" />
<a href="javascript:void(0)" onclick="change()">换一张</a>
</td>
</tr>
<tr>
<td>输入验证码:</td>
<td><input type="text" name="code"/></td>
</tr>
</table>
<input type="submit" value="提交"/>
</form>
简单C#、asp.net mvc验证码的实现的更多相关文章
- ASP.NET MVC验证码演示(Ver2)
前一版本<ASP.NET MVC验证码演示>http://www.cnblogs.com/insus/p/3622116.html,Insus.NET还是使用了Generic handle ...
- ASP.NET MVC验证码演示
我们在网站登录或理一个评论时,可以放置一个验证码(Captcha),可以为系统免去那些恶意刷新等功能. 今次Insus.NET在asp.net mvc应用程序实现与演示验证码的产生以及应用等 . 前天 ...
- ASP.NET mvc 验证码 (转)
ASP.net 验证码(C#) MVC http://blog.163.com/xu_shuhao/blog/static/5257748720101022697309/ 网站添加验证码,主要为防止机 ...
- 简单的ASP.NET MVC发布
学习这样久的ASP.NET MVC,但一直没有实现过发布MVC程序.今天来试试. 分两个部分进行,先是第一部分,Visual Studio的publish:创建一个带有实例的ASP.NET MVC: ...
- 一个简单的ASP.NET MVC异常处理模块
一.前言 异常处理是每个系统必不可少的一个重要部分,它可以让我们的程序在发生错误时友好地提示.记录错误信息,更重要的是不破坏正常的数据和影响系统运行.异常处理应该是一个横切点,所谓横切点就是各个部分都 ...
- asp.net mvc 验证码
效果图 验证码类 namespace QJW.VerifyCode { //用法: //public FileContentResult CreateValidate() //{ // Validat ...
- 一个简单的 ASP.NET MVC 例子演示如何在 Knockout JS 的配合下,使用 TypeScript 。
前言 TypeScript 是一种由微软开发的自由和开源的编程语言.它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程.安德斯·海尔斯伯格,C#的首席架 ...
- 简单实现ASP.Net MVC网页播放音乐
<div> @*音乐*@ <audio id="warning-sound" loop="loop" src="/Areas/Map ...
- Log4net入门(ASP.NET MVC 5篇)
在前4篇Log4net入门文章中,我们讲述了log4net的一些简单用法,在这一篇中我们主要讲述如何在ASP.NET MVC 5项目中将日志信息写入SQL Server数据库中. 一.创建最简单的AS ...
随机推荐
- mysqldump和xtrabackup备份原理实现说明
背景: MySQL数据库备份分为逻辑备份和物理备份两大类,犹豫到底用那种备份方式的时候先了解下它们的差异: 逻辑备份的特点是:直接生成SQL语句,在恢复的时候执行备份的SQL语句实现数据库数据的重现. ...
- Reverse Core 第三部分 - 21章 - Windows消息钩取
@author: dlive @date: 2016/12/19 0x01 SetWindowsHookEx() HHOOK SetWindowsHookEx( int idHook, //hook ...
- C/C++: C++位域和内存对齐问题
1. 位域: 1. 在C中,位域可以写成这样(注:位域的数据类型一律用无符号的,纪律性). struct bitmap { unsigned a : ; unsigned b : ; unsigned ...
- mysqlDBA(1-3年)
1.熟悉Aliyun操作系统的管理.配置和系统调优: 2.熟悉mysql管理 3.熟悉mysql主从复制,主主复制 4.熟悉数据库的备份策略,监控策略,性能测量策略 5.熟悉linux/unix操作系 ...
- Jsonp调用网易云音乐API搜索播放歌曲
效果如下图: 基本就是正常的文件播放,暂停,停止,设置循环,随机播放,加速,减速,上一曲,下一曲,再多个选择本地文件加入到播放列表的功能.然后想着给加个能搜索网络歌曲并且播放的功能,今天研究了一下,成 ...
- wpf的UserControl用户控件怎么添加到Window窗体中
转载自 http://www.cnblogs.com/shuang121/archive/2013/01/09/2853591.html 我们来新建一个用户控件UserControl1.xaml &l ...
- webuploader在IE8/9下上传遇到的两个问题
最近在做图片上传功能. 点击一个按钮,弹出一个iframe,它是百度的webuploader插件 在点击关闭按钮时,IE9下总是会报错: __flash__removeCallback未定义错误 解决 ...
- 与你相遇好幸运,用sinopia搭建npm私服
需求: >在企业内部搭建私有npm服务器,企业开发人员上传下载自己开发的npm包 >私有npm服务器包不存在时,找npm或者taobao的镜像站点 >服务器硬盘有限,希望只缓存下载过 ...
- ***HTML +CSS 总结与归纳
一.首先W3C标准 结构.表现.动作 与 html.css.javascript相对应,它本意是结构表现分离,而且按照html规范编写结构. 标签方面: -所有标签都要小写.关闭.并且合理嵌套,i ...
- 使用静态函数impl模式做接口
使用静态函数impl模式做接口 impl即桥接模式,主要是为了隐藏数据和减少不必要的编译. 普通的impl模式做接口一般是: A类是接口,B类继承A类,是A类的实现,C类,包含A类和B类的头文件,把B ...