MVC生成验证码

  这几天闲着没事,练习一下mvc最新版本,做到了登陆时候,想了一下验证码.这是本人常用的一种

  生成验证码的片段

  

public partial class ValidateCode
{
private void Page_Load(object sender, System.EventArgs e)
{

}

/// <summary> 
/// 根据传入的长度生成随机码 
/// </summary> 
/// <param name="length">随机码个数</param> 
/// <returns></returns> 
public string CreateRandomCode(int length)
{
int rand;
char code;
string randomcode = String.Empty;

//生成一定长度的验证码 
System.Random random = new Random();
for (int i = 0; i < length; i++)
{
rand = random.Next();

if (rand % 3 == 0)
{
code = (char)('A' + (char)(rand % 26));
}
else
{
code = (char)('0' + (char)(rand % 10));
}

randomcode += code.ToString();
}
return randomcode;
}

 

 

 

/// <summary> 
/// 创建随机码图片 
/// </summary> 
/// <param name="randomcode">随机码</param> 
public byte[] CreateImage(string randomcode)
{
int randAngle = 45; //随机转动角度 
int mapwidth = (int)(randomcode.Length * 16);
Bitmap map = new Bitmap(mapwidth, 28); //创建图片背景,设置其长宽 
Graphics graph = Graphics.FromImage(map);
graph.Clear(Color.AliceBlue);
graph.DrawRectangle(new Pen(Color.Black, 0), 0, 0, map.Width - 1, map.Height - 1);//画一个边框

Random rand = new Random();

// 生成背景噪点 
Pen blackPen = new Pen(Color.LightGray, 0);
for (int i = 0; i < 50; i++)
{
int x = rand.Next(0, map.Width);
int y = rand.Next(0, map.Height);
graph.DrawRectangle(blackPen, x, y, 1, 1);
}

//验证码旋转,防止机器识别 
char[] chars = randomcode.ToCharArray();//拆散字符串成单字符数组

//文字距中 
StringFormat format = new StringFormat(StringFormatFlags.NoClip);
format.Alignment = StringAlignment.Center;
format.LineAlignment = StringAlignment.Center;

// 定义随机颜色列表 
Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };
// 定义随机字体字体 
string[] font = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体" };

for (int i = 0; i < chars.Length; i++)
{
int cindex = rand.Next(7);
int findex = rand.Next(5);

Font f = new System.Drawing.Font(font[findex], 16, System.Drawing.FontStyle.Bold); // 字体样式(参数2为字体大小) 
Brush b = new System.Drawing.SolidBrush(c[cindex]);

Point dot = new Point(11, 11); // 括号内数值越大,字符间距越大 
float angle = rand.Next(0, randAngle); // 转动的度数,如果将0改为-randAngle,那么旋转角度为-45度~45度

graph.TranslateTransform(dot.X, dot.Y);
graph.RotateTransform(angle);
graph.DrawString(chars[i].ToString(), f, b, 2, 6, format); // 第4、5个参数控制左、上间距 
graph.RotateTransform(-angle);
graph.TranslateTransform(2, -dot.Y);
}

//生成图片 
System.IO.MemoryStream ms = new System.IO.MemoryStream();
map.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);

graph.Dispose();
map.Dispose();

return ms.ToArray();

}

}

 

 

=====================登陆控制器======================================

 

 

public  class LoginController : Controller

{

  

//
// GET: /Login/

public ActionResult Login()
{
return View();
}

 

///返回图片文件格式的Action

public ActionResult ShowValidateCode()
{
ValidateCode code = new ValidateCode();//调用验证码类
string strRandom = code.CreateRandomCode(4);//传入生成验证码的个数,生成4个长度的验证码
Session["code"] = strRandom;//把验证码保存在session中,方便后面比对

byte[] b = code.CreateImage(strRandom);//把验证码字符串生成图片格式的字节

return File(b, "image/jpeg");//创建一个jpg图片格式文件
}

 

=====================登陆控制器结束======================================

 

login.cshtml页面添加标签 

 

  <img id="ValidateCodeImg" src="/Login/ShowValidateCode" />

 

======================================================================

<script>

$($("#ValidateCodeImg").bind("click", function () {

changeValidateCode();
}))


function changeValidateCode() {
var num = new Date().getMilliseconds();
$("#ValidateCodeImg").attr("src", $("#ValidateCodeImg").attr("src") + "?num=" + num);
}

}

 

</script>

 

这里把获得验证码的方法写成js方便刷新或者登陆失败的时候重新调用.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值