验证码的作用有防止电脑自动登录的,也有验证是否是本人登录的,验证的方式有许多种比如常见的字符串图片验证,近几年兴起的类拼图验证(其实我也不知道这个应该叫啥)以及短信验证等等,今天在这我要写的是用来防止电脑自动登录的字符串图片验证码。另外我是将这个字符串验证码图片分成两步来写的,在这之前先要说明这个方法属于静态类,那什么是静态:
如果类的方法前加了static关键字,则该方法称为静态方法,反之为实例方法。静态方法为类所有,可以通过对象来使用,也可以通过类来使用。但一般提倡通过类名来使用,因为静态方法只要定义了类,不必建立类的实例就可使用。静态方法只能调用静态变量。——引用于百度百科
首先当然是声明一个公共的静态类来存放两个静态方法(成员)两个静态方法分别是用来生成随机字符串的静态方法GetRandomCode与根据获取的字符串来创建验证码图片的静态方法CreateImage(两个静态方法的名称可以自己命名,这里只写了静态方法GetRandomCode的代码),那么静态类的声明与非静态类的声明有什么区别呢?我只找出了两点区别,第一点:静态类在public后面有一个static,而非静态类在public没有static,第二点:静态类中不能创建实例方法 (成员),但是可以使用类的实例(总感觉这句话哪有问题,就是找不到),非静态类中可以声明静态方法(PS:就是不知道会不会出现什么问题)。
那么我们来完成第一步,生成19与大小写AZ随机组合的字符串。那么在这个静态类中先声明一个变量用于存放字符串,利用关键字string声明这个变量并将string的属性Empty(这个应该是属性吧)赋值给这个变量,然后实例化Random(表示伪随机数生成器,一种能够产生满足某些随机性统计要求的数字序列的设备——Visual
Studio 2015对Random的摘要)这个对象。
在for循环中声明一个char类型的对象用于存放数据,声明一个int变量并利用实例化的Random对象中的方法Next(方法Next()可以产生一个随机的非负整数)赋值,
再利用分支语句if…else if中将得到的随机非整数除以三取余,那么当余数等于零时,将生成的随机非负整数除以10取余,再将生成的余数加上十六进制的30(也就是十进制的48)之后强制转换成ASCII值存入之前声明为char类型的对象中。
若是余数等于1,将生成的随机非负整数除以十六进制的1a(十进制的26)取余,再将生成的余数加上十六进制的41(十进制的65)之后强制转换成ASCII值存入之前声明为char类型的对象中。
如果余数等于2,则是将生成的随机非负整数除以十六进制的1a(十进制的26)取余,再将生成的余数加上十六进制的61(十进制的97)之后强制转换成ASCII值存入之前声明为char类型的对象中。
其实在这个if…else if的分支语句中只要能够保证获取到的ASCII值是在48-57、65-90、97-122当中,是用十进制也好八进制也罢,只要在这个范围当中if…else if的分支语句怎么写都行。
在这个for循环中利用方法ToString将获取到的ASCII值转换为等效的字符串表现形式再进行拼接,拼接字符串的长度由这个静态方法的参数决定(ASCII值中的48-57转换为数字0-9,65-90转换为大写字母A-Z,97-22转换为小写字母a-z)。将拼接好的字符串返回控制器。
以下复制过来的代码:
public static class ValidCodeUtils //公共静态
{
///<summary>
/// 获得随机字符串
/// </summary>
/// <param name="intLength">随机字符串的长度</param>
/// <returns>随机数字符串</returns>
public static string GetRandomCode(int intLength)//intLength指定随机字符串的长度
{
string strReturn = string.Empty;
Random random = new Random();//随机数
for (int i = 0; i < intLength; i++)
{
char cRerult;
int intRandom = random.Next();
if (intRandom % 3 == 0) //根据当前随机数来确定字符串,intRandom % 3 获取的是intRandom/3 得到的余数
{ //产生数字
//位数来产生数字
cRerult = (char)(0x30 + (intRandom % 10));
}
else if (intRandom % 3 == 1)
{ //位数产生大写字母:大写字符 65-97 A 65
//68D 25 Z
cRerult = (char)(0x41 + (intRandom % 0x1a));
}
else
{
//余数为2 //产生小写字母 98 -116
cRerult = (char)(0x61 + (intRandom % 0x1a));
}
strReturn += cRerult.ToString();//拼接字符串
}
return strReturn;
}
}
至于如何根据获取到的字符串来创建验证码图片,那就在下篇文献当中了。