进行开发某些项目的时候,一般情况下每一个项目都是会有一个登录的功能,这个登录的功能主要包括一个账号输入框,也就是文本框,一个密码框,这个密码框也是文本框的一种,只不过它这个框里面输入的字符是不可见的,全部显示为一个*号,还有一个验证码输入框和验证码的一个获取类型,这里的验证码输入框和账号输入框是一样的,都是文本框,而且输入内容都是可见的,至于验证码获取,有很多种类型,有图片验证码,手机短信验证码等等,现在我们常见的验证码就是这两种,还有一个是登录按钮,一个登录的功能基本就是由以上几个模块组成。
我们都知道,账号输入框的和密码输入框和验证码输入框都是属于文本框,也就是input标签,这就不用我细说了,对于验证码呢?有图片验证码和手机号短信验证码,我就简单的介绍一下在MVC中它图片验证码的生成方法。
首先我们得有一个页面,在页面上得有一个装图片验证码的容器,在容器里面放置一个img图片标签,然后切换到MVC控制台代码页,先定义一个控制台方法,内容如下:
public ActionResult CreateValidCodeImage()
{
//1、生成长度为5的随机的验证码字符串
string strRandom = ValidCodeUtils.GetRandomCode(5);
//2、根据生成的验证码字符串生成 验证码图片
byte[] imgByte = ValidCodeUtils.CreateImage(strRandom);
//3、将验证码字符串存入session中 key值为
Session["validCode"] = strRandom;
//4、把图片返回到视图
return File(imgByte, @"image/jpeg");
}
紧接着再定义一个公共静态类的方法,静态类内容如下:
public static class ValidCodeUtils//static class公共静态类
{
/// <summary>
/// 获得随机字符串
/// </summary>
/// <param name="intLength">随机数的长度</param>
/// <returns>随机数字符串</returns>
public static string GetRandomCode(int intLength)//公共静态类的方法
//static string GetRandomCode(int intLength)产生一个随机的字符串编码/(int intLength)参数表示随机数的长度,你需要多少位数的字符串随机验证码
{
///*产生数字和密码混合的随机数*/
string strReturn = string.Empty;
Random random = new Random();//Random创建随机类用来随机生成数字
for (int i = 0;i< intLength; i++)//for循环,需要几位数就循环多少次
{
char cRerult;//产生的是随机的数字,而表示字符串,
int intRandom = random.Next();//产生一个非负随机整数,验证码中不能有负数的出现0到正无穷
//根据当前随机数来确定字符串
//intRandom %3 获取的是intRandom 除以3得到的余数
if (intRandom % 3 == 0)//如果intRandom除以3为0的话就执行以下代码
{
//产生数字
//位数来产生数字
cRerult = (char)(0x30 + (intRandom % 10));
}
else if(intRandom % 3 == 1)
{
//产生大写字母 :大写字符 65-97 A 65
//68 D 25 Z ----65-97==A--Z
cRerult = (char)(0x41 + (intRandom % 0x1a));
//40==65///1a==26%1=25 产生范围65+25
}
else
{
//余数为2
//产生小写字母: 98-116= a - z
cRerult = (char)(0x61 + (intRandom % 0x1a));
}
//拼接数字和字符产生字符串-
strReturn += cRerult.ToString();
}
//返回一个随机产生的字符串
return strReturn;
}
完成上面一步之后,再定义一个方法,根据字符串创建一个验证码,内容如下:
public static byte[] CreateImage(string strRandom)//把上面的获取到的随机字符串传进来
{
//新增一张白纸图片画布,
Bitmap newBitmap = new Bitmap(300, 150);//
//添加一支画笔
Graphics g = Graphics.FromImage(newBitmap);
//填充画布的颜色,默认是空的
g.Clear(Color.White) ;//填充白色背景
//在图片上绘制文字
SolidBrush solidBrush=new SolidBrush(Color.LightCoral);//写在画布上的字符串的颜色
g.DrawString(strRandom, new Font("Aril", 66), solidBrush, 100, 18);//DrawString画、strRandom, new Font("Aril", 18)画字符串,字体大小、solidBrush, 12, 4从哪里开始画X,y轴
//画干扰线//目的为了拦截机器识别
//再创建一个随机类
Random random = new Random();
//画10条
for(int i = 0; i < 10; i++)
{
//产生一条线,并绘制到画布。 起始点(x,y) 总结点
//坐标
int x1 = random.Next(newBitmap.Width);
int y1 = random.Next(newBitmap.Height);
int x2 = random.Next(newBitmap.Width);
int y2 = random.Next(newBitmap.Height);
g.DrawLine(new Pen(Color.Red), x1, y1, x2, y2);
}
//绘制图片的前景的干扰点
for(int i = 0; i < 1000; i++)
{
int x = random.Next(newBitmap.Width);
int y = random.Next(newBitmap.Height);
newBitmap.SetPixel(x, y, Color.FromArgb(random.Next()));//颜色随机,通过随机数转化一种颜色出来
}
//在最外边绘制边框
g.DrawRectangle(new Pen(Color.Blue), 0, 0, newBitmap.Width, newBitmap.Height);
g.DrawRectangle(new Pen(Color.Blue), -1, -1, newBitmap.Width, newBitmap.Height);
//将图片保存到内存流当中
MemoryStream ms = new MemoryStream();//MemoryStream内存流
newBitmap.Save(ms, ImageFormat.Jpeg);
return ms.ToArray();//将流内容写入byte数组返回//返回成数组
}
上面方法全部完成之后,再回到页面上,在前面已经搭建好的图片验证码的容器里面的img标签添加一个路径src,路径就是控制台+刚刚上面定义好的第一个方法的名称,图片示例如下:
这样基本上一个图片验证码的生成就完成了,下面是页面实现效果:
当然,上面也说了,这只不过是基本完成而已,这个样子你的验证码是固定的,不会改变,只有强制刷新页面才会改变,这个时候,我们可以定义一个方法,每出发这个方法的时候,就调用一次验证码生成的方法,好比如我是通过点击拥有某一个ID名称的元素来触发这个方法,那么下面是代码写法:
$("#yzm").click(function () {
//alert("绑定成功");
$(this).prop("src", "/yanzhengma/CreateValidCodeImage?t=" + new Date().getTime());//为了避免浏览器的缓存机制,改变参数
})
至于浏览器有一个缓存机制,所以我们要改变一下路径的参数,不然验证码的图片也是不会改变的。