ASP.NET MVC实现网站验证码功能
转:http://www.cnblogs.com/liuxiaoji/p/4920382.html
网站添加验证码,主要为防止机器人程序批量注册,或对特定的注册用户用特定程序暴力破解方式,以进行不断的登录、灌水等危害网站的操作。验证码被广泛应用在注册、登录、留言等提交信息到服务器端处理的页面中。
在ASP.NET网站中应用验证码是很容易的,网上有很多的解决方案。最近在做一个OA项目,因系统采用的ASP.NET MVC框架,同样在登录页中需用到验证码,故需将原来在ASP.NET网站中使用的验证码移植到ASP.NET MVC中。
原ASP.NET网站用来生成验证码的类文件ValidateCode.cs:
using System; using System.Drawing; using System.Drawing.Imaging; using System.Web.UI; using System.Drawing.Drawing2D; using System.IO;namespace SeniOA.MVC {/// <summary>/// 生成验证码的类/// </summary>public class ValidateCode{public ValidateCode(){}/// <summary>/// 验证码的最大长度/// </summary>public int MaxLength{get { return 10; }}/// <summary>/// 验证码的最小长度/// </summary>public int MinLength{get { return 1; }}/// <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(0, Int32.MaxValue - length * 10000);int[] seeks = new int[length];for (int i = 0; i < length; i++){beginSeek += 10000;seeks[i] = beginSeek;}//生成随机数字for (int i = 0; i < length; i++){Random rand = new Random(seeks[i]);int pownum = 1 * (int)Math.Pow(10, length);randMembers[i] = rand.Next(pownum, Int32.MaxValue);}//抽取随机数字for (int i = 0; i < length; i++){string numStr = randMembers[i].ToString();int numLength = numStr.Length;Random rand = new Random();int numPosition = rand.Next(0, numLength - 1);validateNums[i] = Int32.Parse(numStr.Substring(numPosition, 1));}//生成验证码for (int i = 0; i < length; i++){validateNumberStr += validateNums[i].ToString();}return validateNumberStr;}/// <summary>/// 创建验证码的图片/// </summary>/// <param name="containsPage">要输出到的page对象</param>/// <param name="validateNum">验证码</param>public void CreateValidateGraphic(string validateCode){Bitmap image = new Bitmap((int)Math.Ceiling(validateCode.Length * 12.0), 22);Graphics g = Graphics.FromImage(image);try{//生成随机生成器Random random = new Random();//清空图片背景色 g.Clear(Color.White);//画图片的干扰线for (int i = 0; i < 25; 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", 12, (FontStyle.Bold | FontStyle.Italic));LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height),Color.Blue, Color.DarkRed, 1.2f, true);g.DrawString(validateCode, font, brush, 3, 2);//画图片的前景干扰点for (int i = 0; i < 100; 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), 0, 0, image.Width - 1, image.Height - 1);//保存图片数据MemoryStream stream = new MemoryStream();image.Save(stream, ImageFormat.Jpeg);//输出图片流 containsPage.Response.Clear();containsPage.Response.ContentType = "image/jpeg";containsPage.Response.BinaryWrite(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;}} }
View Code
为适合ASP.NET MVC框架,修改其输出图片流的方法CreateValidateGraphic为:
/// <summary> /// 创建验证码的图片 /// </summary> /// <param name="containsPage">要输出到的page对象</param> /// <param name="validateNum">验证码</param> public byte[] CreateValidateGraphic(string validateCode) {Bitmap image = new Bitmap((int)Math.Ceiling(validateCode.Length * 12.0), 22);Graphics g = Graphics.FromImage(image);try{//生成随机生成器Random random = new Random();//清空图片背景色 g.Clear(Color.White);//画图片的干扰线for (int i = 0; i < 25; 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", 12, (FontStyle.Bold | FontStyle.Italic));LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height),Color.Blue, Color.DarkRed, 1.2f, true);g.DrawString(validateCode, font, brush, 3, 2);//画图片的前景干扰点for (int i = 0; i < 100; 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), 0, 0, image.Width - 1, image.Height - 1);//保存图片数据MemoryStream stream = new MemoryStream();image.Save(stream, ImageFormat.Jpeg);//输出图片流return stream.ToArray();}finally{g.Dispose();image.Dispose();} }
View Code
在Controller.cs中,添加Action,用来设置将生成的验证码存入Session,并输出验证码图片:
public ActionResult GetValidateCode() {ValidateCode vCode = new ValidateCode();string code = vCode.CreateValidateCode(5);Session["ValidateCode"] = code;byte[] bytes = vCode.CreateValidateGraphic(code);return File(bytes, @"image/jpeg"); }
View Code
调用方式为:在需要使用验证码的页面中,加入<img>标签:
<img id="valiCode" src="../Account/GetValidateCode" alt="验证码" />
到于Account/Login这个Action中的处理,只需加入对Session中验证码的判断:
[AcceptVerbs(HttpVerbs.Post)] public ActionResult Login(string userName, string password, bool rememberMe, string returnUrl,string code) {if (Session["ValidateCode"].ToString() != code){ModelState.AddModelError("code", "validate code is error");return View();}//此处验证用户名、密码if (!ValidateLogOn(userName, password)){return View();}//验证成功 FormsAuthentication.SetAuthCookie(userName, rememberMe);if (!String.IsNullOrEmpty(returnUrl)){return Redirect(returnUrl);}else{return RedirectToAction("Index", "Home");} }
View Code
为实现登录页中,点击图片切换验证码,可以登录页中加入此JS代码实现刷新验证码:
<script type="text/javascript" src="http://www.cnblogs.com/Scripts/jquery-1.3.2-vsdoc.js"></script> <script type="text/javascript">$(function() {$("#valiCode").bind("click", function() {this.src = "../Account/GetValidateCode?time=" + (new Date()).getTime();});//alert("good"); }); </script>
View Code
转载于:https://www.cnblogs.com/love201314/p/4922888.html
ASP.NET MVC实现网站验证码功能相关推荐
- ASP.NET.MVC实现网站验证码功能
开发工具与关键技术:Visual Studio 2015 生成验证码 作者:孙水兵 撰写时间:2019年5月7 一.为什么网站要用到验证码 因为WEB站有时会碰到客户机恶意攻击,其中一种很常见的攻击手 ...
- 为ASP.NET MVC扩展异步Action功能(下)
本文分为上下两部分,您也可以从<Extend ASP.NET MVC for Asynchronous Action>获得全部内容. 执行Action方法 对于执行同步Action的Syn ...
- [.NET][ASP.NET MVC 5 网站开发之美]书籍内容介绍及pdf下载
ASP.NET MVC是微软Web开发平台中最重要的一块拼图,其架构特性更适合用来开发大型的Web应用程序,且ASP.NET MVC的开发方式也越来越受到重视,因此学习MVC已是刻不容缓. 由demo ...
- ASP.NET MVC 学习网站
1.微软官方 官方网站 www.asp.net/mVC ASP.NET MVC QuickStart文档.http://quickstarts.asp.net/previews/mvc/ 视频教程(M ...
- asp.net mvc 简易上传功能
1.上传图片页面 VIEW <%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %> ...
- ASP.NET MVC商城网站后台管理系统
本项目使用了大量的插件,所有的商品数据皆为动态加载,全部从数据库中读取呈现在界面上,具备商品管理.用户管理等功能,还可查看商品的相关数据汇总.本项目对应的网上商城在上一篇文章中. 界面展示(部分) 代 ...
- ASP.NET MVC 微博网站--获取关注的人的微博和我的微博
总代码如下: public ActionResult GetNoticeBC() {GDCPSIMEntities dc = new GDCPSIMEntities();dc.Configuratio ...
- 【转】asp.net mvc生成验证码
ASP.NET MVC实现网站验证码功能 网站添加验证码,主要为防止机器人程序批量注册,或对特定的注册用户用特定程序暴力破解方式,以进行不断的登录.灌水等危害网站的操作.验证码被广泛应用在注册.登录. ...
- [转]Asp.net mvc 网站之速度优化 -- 页面缓存
网站速度优化的一般方法 由于网站最重要的用户体验就是速度,特别是对于电子商务网站而言. 一般网站速度优化会涉及到几个方面: 1. 数据库优化 - 查询字段简历索引,使用数据库连接池和持久化,现在还有种 ...
- 总结一下ASP.NET MVC 网站的部署问题
近日,准备把MVC建了一个新的测试站点部署到IIS上面,结果没想到出现了一系列的问题和错误,准备记录一下. 第一个问题,就是如何将MVC的站点部署到IIS上去? 现在我的系统是Windows 7,II ...
最新文章
- 最终章|一分钟详解PCL编译过程
- 实施Service Mesh前,你需要考虑这几个问题
- CIC抽取插值滤波器和RCF
- Oracle数据库备份与还原命令
- 8、Semantic-UI之其他按钮样式
- sqlserver excel,txt,access等文件的互導
- 单片机c语言必背代码_【典藏】深度剖析单片机程序的运行(C程序版)
- 循环的时候去删除集合中的元素 java.util.ConcurrentModificationException
- PHP环境搭配(二):lamp(linux+apache+mysql+php)搭建,附moodle与onlinejudge配置
- Hadoop笔记整理(二):HDFS
- graphpad折线图教程_GraphPad Prism 8.0绘制误差连线并填充颜色图
- python批量修改文件内容(修改文件指定行)
- 多个模型融合训练神经网络-devise模型的实现
- 淘宝店铺运营,店铺访客增加但是浏览量减少这是为什么,应该怎样解决?
- 高清车牌识别系统无法连接服务器,智能停车场高清车牌识别系统,常见的故障及解决方法!...
- 手机型号云服务器,手机型号云服务器
- 用python输出圣诞树_教你怎样用Python画了一棵圣诞树,赶紧来学习
- matlab plot大小,Matlab 修改plot大小
- VirtualBox复制虚拟机(同电脑、跨电脑)
- 猿圈 题库_百度传课携手猿圈 接入题库及测评服务