标签:
好,今天是中国抗战70周年的大阅兵,看完中国炫耀完属于他的武器之后,不由自主的小弟自己在编程方面的实力,是如此的薄弱,这些都是提外话来的,我这样做的目的是让那些看我博客的人不会感到如此的无聊,我知道,看博客是意见很枯燥的事情,我看博客也是很喜欢看看博主写的题外话,很有意思。
但是小弟的文化水平有限,能将的题外话就是那么多,希望大家不要介意哦,我只是一个刚刚毕业的学生,满腔热血的青少年,充满梦想的骚年,我为我自己代言,
上面是在打广告,广告看多了不要介意,
好了,闲话我就不说了,我也说不出了,哈哈,现在就进入我们今天的主题了,就是大名鼎鼎的MVC架构下实现登陆验证码,其实这些代码我也是在网上抄下来的,在这里想跟大家一次来讨论下。
我们先进入到控制器吧:
public ActionResult CheckCode() { //生成验证码 ValidateCode validateCode = new ValidateCode();//这里是我在控制器来新建了一个叫ValidataCode的类,作用是相当的强大,下面我就贴这个类的代码 string code = validateCode.CreateValidateCode(4);//这里是调用ValidataCode这个类的CrratVAalidataCode方法,这可方法主要就用来返回验证码的字符串,参数4是返回一个4位的字符串 Session["ValidateCode"] = code;//把返回的字符串加入Sesstion里 byte[] bytes = validateCode.CreateValidateGraphic(code);//这里也是调用了CreateValidataGraphic的这个方法,返回二进制位的字节,也就是图片的字节数据 return File(bytes, @"image/jpeg"); }
好,我这这里贴出ValidataCode的这里类:
1 using System; 2 using System.Collections.Generic; 3 using System.Drawing; 4 using System.Drawing.Drawing2D; 5 using System.Drawing.Imaging; 6 using System.IO; 7 using System.Linq; 8 using System.Web; 9 10 namespace _验证码.Controllers 11 { 12 public class ValidateCode 13 { 14 public ValidateCode() 15 { 16 } 17 /// <summary> 18 /// 验证码的最大长度 19 /// </summary> 20 public int MaxLength 21 { 22 get { return 10; } 23 } 24 /// <summary> 25 /// 验证码的最小长度 26 /// </summary> 27 public int MinLength 28 { 29 get { return 1; } 30 } 31 /// <summary> 32 /// 生成验证码 33 /// </summary> 34 /// <param name="length">指定验证码的长度</param> 35 /// <returns></returns> 36 public string CreateValidateCode(int length) 37 { 38 int[] randMembers = new int[length]; 39 int[] validateNums = new int[length]; 40 string validateNumberStr = ""; 41 //生成起始序列值 42 int seekSeek = unchecked((int)DateTime.Now.Ticks); 43 Random seekRand = new Random(seekSeek); 44 int beginSeek = (int)seekRand.Next(0, Int32.MaxValue - length * 10000); 45 int[] seeks = new int[length]; 46 for (int i = 0; i < length; i++) 47 { 48 beginSeek += 10000; 49 seeks[i] = beginSeek; 50 } 51 //生成随机数字 52 for (int i = 0; i < length; i++) 53 { 54 Random rand = new Random(seeks[i]); 55 int pownum = 1 * (int)Math.Pow(10, length); 56 randMembers[i] = rand.Next(pownum, Int32.MaxValue); 57 } 58 //抽取随机数字 59 for (int i = 0; i < length; i++) 60 { 61 string numStr = randMembers[i].ToString(); 62 int numLength = numStr.Length; 63 Random rand = new Random(); 64 int numPosition = rand.Next(0, numLength - 1); 65 validateNums[i] = Int32.Parse(numStr.Substring(numPosition, 1)); 66 } 67 //生成验证码 68 for (int i = 0; i < length; i++) 69 { 70 validateNumberStr += validateNums[i].ToString(); 71 } 72 return validateNumberStr; 73 } 74 /// <summary> 75 /// 创建验证码的图片 76 /// </summary> 77 /// <param name="containsPage">要输出到的page对象</param> 78 /// <param name="validateNum">验证码</param> 79 public byte[] CreateValidateGraphic(string validateCode) 80 { 81 Bitmap image = new Bitmap((int)Math.Ceiling(validateCode.Length * 12.0), 22); 82 Graphics g = Graphics.FromImage(image); 83 try 84 { 85 //生成随机生成器 86 Random random = new Random(); 87 //清空图片背景色 88 g.Clear(Color.White); 89 //画图片的干扰线 90 for (int i = 0; i < 25; i++) 91 { 92 int x1 = random.Next(image.Width); 93 int x2 = random.Next(image.Width); 94 int y1 = random.Next(image.Height); 95 int y2 = random.Next(image.Height); 96 g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2); 97 } 98 Font font = new Font("Arial", 12, (FontStyle.Bold | FontStyle.Italic)); 99 LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), 100 Color.Blue, Color.DarkRed, 1.2f, true); 101 g.DrawString(validateCode, font, brush, 3, 2); 102 //画图片的前景干扰点 103 for (int i = 0; i < 100; i++) 104 { 105 int x = random.Next(image.Width); 106 int y = random.Next(image.Height); 107 image.SetPixel(x, y, Color.FromArgb(random.Next())); 108 } 109 //画图片的边框线 110 g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1); 111 //保存图片数据 112 MemoryStream stream = new MemoryStream(); 113 image.Save(stream, ImageFormat.Jpeg); 114 //输出图片流 115 return stream.ToArray(); 116 } 117 finally 118 { 119 g.Dispose(); 120 image.Dispose(); 121 } 122 } 123 /// <summary> 124 /// 得到验证码图片的长度 125 /// </summary> 126 /// <param name="validateNumLength">验证码的长度</param> 127 /// <returns></returns> 128 public static int GetImageWidth(int validateNumLength) 129 { 130 return (int)(validateNumLength * 13.0); 131 } 132 /// <summary> 133 /// 得到验证码的高度 134 /// </summary> 135 /// <returns></returns> 136 public static double GetImageHeight() 137 { 138 return 25.5; 139 } 140 } 141 }
下面是View的代码了,这个很简单,我相信了解过MVC的同学都是知道的,我就不详细说了。
<form action="Home/Index" method="post"> 输入验证码:<input type="text" name="CustomerName" /> <img id="valiCode" src="~/Home/CheckCode" alt="验证码" /> <p><input type="submit" value="提交" /></p> </form>
接下来就是验证验证码了,我用得是form表单的形式,提交到控制器来,这个大家都会了吧,我在这里就不写验证方法了,如果大家对form表单不熟的话,就尽情的来呼唤小弟来写写吧,毕竟小弟的文笔不好,哈哈,好,写到这里就算是写完了,看懂了的,没看懂的,我都希望各位能一起来讨论下技术方面的东西,第一次写博客,我想弱弱的问问,在这里留下手机号码和QQ号码会怎么样的,会坐牢的吗,管他呢,731354518,哈哈,你们懂的
标签:
原文地址:http://www.cnblogs.com/Coloor/p/Coloor.html