写在前面

断断续续,今天算是把验证码的东东弄出来了。

系列文章

[EF]vs15+ef6+mysql code first方式

[实战]MVC5+EF6+MySql企业网盘实战(1)

[实战]MVC5+EF6+MySql企业网盘实战(2)——用户注册

[实战]MVC5+EF6+MySql企业网盘实战(2)——验证码

验证码类

using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Wolfy.NetDisk.Utilities
{
/// <summary>
/// 验证码类
/// </summary>
public static class VerifyCode
{
/// <summary>
/// 生成验证码
/// </summary>
/// <param name="len">验证码长度</param>
/// <param name="strCode">验证码</param>
/// <returns>验证码图片</returns>
public static byte[] Create(int len, out string strCode)
{
MemoryStream stream = new MemoryStream();
byte[] buffer = null;
//噪线 噪点
Color[] colors = { Color.Black, Color.Red, Color.Blue, Color.Green, Color.Orange, Color.Brown, Color.DarkBlue };
//验证码字体
string[] fonts = { "Times New Roman", "MS Mincho", "Book Antiqua", "Gungsuh", "PMingLiU", "Impact" };
//验证码内容
char[] charactars = { '', '', '', '', '', '', '', '', '', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'S', 'Y', 'Z' };
//生成验证码字符串
StringBuilder sb = new StringBuilder();
Random r = new Random();
for (int i = ; i < len; i++)
{
char codeChar = charactars[r.Next(, charactars.Length)];
sb.Append(codeChar);
}
strCode = sb.ToString();
using (Bitmap bitmap = new Bitmap(len * , ))
{
using (Graphics g = Graphics.FromImage(bitmap))
{
g.Clear(Color.White);
for (int i = ; i < ; i++)
{
int x1 = r.Next();
int y1 = r.Next();
int x2 = r.Next();
int y2 = r.Next();
Color color = colors[r.Next(colors.Length)];
g.DrawLine(new Pen(color), x1, y1, x2, y2);
}
//将字符串画入图片
for (int i = ; i < strCode.Length; i++)
{
string font = fonts[r.Next(fonts.Length)];
Font fnt = new Font(font, );
Color color = colors[r.Next(colors.Length)];
g.DrawString(strCode[i].ToString(), fnt, new SolidBrush(color), (float)i * + , (float));
}
//画噪点
for (int i = ; i < ; i++)
{
int x = r.Next(bitmap.Width);
int y = r.Next(bitmap.Height);
Color color = colors[r.Next(colors.Length)];
bitmap.SetPixel(x, y, color);
}
}
bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
buffer = stream.ToArray();
} return buffer; }
}
}

在UserInfoController中添加Action

  [HttpGet]
public ActionResult VerifyCodeImage()
{
string strCode = string.Empty;
byte[] buffer = VerifyCode.Create(, out strCode);
Session["code"] = strCode;
return File(buffer, @"image/jpeg");
}

注册页面上添加验证码的表单输入框

    <div class="form-group">
<label class="control-label col-md-2">验证码</label>
<div class="col-md-10">
<input type="text" name="name" value=" " /> <img id="imgCode" style="cursor:pointer;" title="切换下一张" src="/UserInfo/VerifyCodeImage" alt="验证码" />
</div>
</div>

为验证码图片添加单击事件,切换下一张,为了避免缓存,添加随机数参数,保证每次请求是一次新的请求。

<script>
$(function () {
$("#imgCode").click(function () {
var ran = Math.random();
//加上随机数ran,避免验证码缓存。
this.src = "/UserInfo/VerifyCodeImage?_r=" + ran;
});
}); </script>

页面测试

总结

今天比平时早回来会儿,就趁着做了一个功能,进度有点慢啊。

[实战]MVC5+EF6+MySql企业网盘实战(2)——验证码的更多相关文章

  1. [实战]MVC5+EF6+MySql企业网盘实战(28)——其他列表

    写在前面 本篇文章将实现,其他文件类型的列表. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战]MVC5+EF6+MySql企业网盘实战(1) [实战]MVC5+EF ...

  2. [实战]MVC5+EF6+MySql企业网盘实战(27)——应用列表

    写在前面 本篇文章将实现应用列表,同样和其他列表的不同之处,在于查询条件的不同. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战]MVC5+EF6+MySql企业网盘 ...

  3. [实战]MVC5+EF6+MySql企业网盘实战(4)——上传头像

    写在前面 最近又开始忙了,工期紧比较赶,另外明天又要去驾校,只能一个功能一个功能的添加了,也许每次完成的功能确实不算什么,等将功能都实现了,然后在找一个好点的ui对前端重构一下. 系列文章 [EF]v ...

  4. [实战]MVC5+EF6+MySql企业网盘实战(2)——用户注册

    写在前面 上篇文章简单介绍了项目的结构,这篇文章将实现用户的注册.当然关于漂亮的ui,这在追后再去添加了,先将功能实现.也许代码中有不合适的地方,也只有在之后慢慢去优化了. 系列文章 [EF]vs15 ...

  5. [实战]MVC5+EF6+MySql企业网盘实战(1)

    写在前面 不久前,一个朋友让帮他弄一个单位的企业网盘的管理站点,一直忙,最近抽出了点时间,也想琢磨琢磨mvc,ef,mysql,这算是边琢磨,边实践吧. 系列文章 [实战]MVC5+EF6+MySql ...

  6. [实战]MVC5+EF6+MySql企业网盘实战(26)——音乐列表

    写在前面 本篇文章将实现,音乐列表,同样和其他列表的不同之处,在于查询条件的不同. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战]MVC5+EF6+MySql企业网 ...

  7. [实战]MVC5+EF6+MySql企业网盘实战(25)——种子列表

    写在前面 上篇文章实现了视频列表,本篇文章继续实现其他的文件列表.功能相似.这里就不再赘述. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战]MVC5+EF6+MyS ...

  8. [实战]MVC5+EF6+MySql企业网盘实战(24)——视频列表

    写在前面 上篇文章实现了文档列表,所以实现视频列表就依葫芦画瓢就行了. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战]MVC5+EF6+MySql企业网盘实战(1) ...

  9. [实战]MVC5+EF6+MySql企业网盘实战(23)——文档列表

    写在前面 上篇文章实现了图片列表,这篇文章实现文档列表将轻车熟路,因为逻辑基本相似,只是查询条件的不同.这里将txt,doc,docx,ppt,pptx,xls,xlsx的文件都归为文档列表中. 系列 ...

随机推荐

  1. 前端可视化编程:liveReload安装,sublime 3

    需要插件  sublime text3:View in Browser:LiveReload chrome:liveReload 配置方法 一:sublime text3 sublime 3下载地址: ...

  2. JavaScript实现最简单的拖拽效果

    一.一些无关痛痒的唠叨 拖拽还是挺不错的一个页面效果,我个人认为,其生命力在于可以让用户自己做一些操作,所谓自定义.例如: ①浏览器标签顺序的拖拽切换 现在基本上所有的选项卡式的浏览器都有顺序拖拽切换 ...

  3. tooltips插件

    摘要: 继‘带箭头提示框’,本文将分享几款带箭头提示框. qtipqTip是一种先进的提示插件,基于jQuery框架.以用户友好,而且功能丰富,qTip为您提供不一般的功能,如圆角和语音气泡提示,并且 ...

  4. ASCII码与16进制的互相转换(表)

    所谓的ASCII和16进制都只是概念上的东西,在计算机中通通是二进制 转换应该是输出的转换,同样是一个数,在计算机内存中表示是一样的,只是输出不一样ASCII是针对字符的编码,几乎是键盘上的字符的编码 ...

  5. php中实现记住密码下次自动登录的例子

    这篇文章主要介绍了php中实现记住密码下次自动登录的例子,本文使用cookie实现记住密码和自动登录功能,需要的朋友可以参考下 做网站的时候经常会碰到要实现记住密码,下次自动登录,一周内免登陆,一个月 ...

  6. if条件和for循环语句、while、do..while、switch语法

    //if 语句 ; ) { NSLog(@"不及格"); }) { NSLog(@"及格"); } //if语句 判断条件存在多个情况下,判断一个年是否为润年 ...

  7. Python 文件学习笔记

    程序1 在上一题的基础上扩展,用户可以随意输入要显示的行数. 如输入2:5表示打印第2行到第5行的内容: 输入:2表示打印从开头到第2行的内容: 输入4:表示打印从第4行到结尾的内容: 输入:表示打印 ...

  8. Spring quartz Job不能依赖注入,Spring整合quartz Job任务不能注入

    Spring quartz Job不能依赖注入,Spring整合quartz Job任务不能注入 Spring4整合quartz2.2.3中Job任务使用@Autowired不能注入 >> ...

  9. 说说C与汇编之间的互相联系(转)

    在嵌入式系统开发中,目前使用的主要编程语言是C和汇编,C++已经有相应的编译器,但是现在使用还是比较少的.在稍大规模的嵌入式软件中,例如含有OS,大部分的代码都是用C编写的,主要是因为C语言的结构比较 ...

  10. ajax劫持?

    <html<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=ut ...