锵锵三人行 马伊俐,中国市长 纪录片,农业天地
我们在项目中的newweb.common类库里面建立一个类用来存放生成验证码的代码。
这里我类的名字叫 validatecode
生成验证码(validatecode)类的代码:
using system; using system.collections.generic; using system.drawing; using system.drawing.drawing2d; using system.drawing.imaging; using system.io; using system.linq; using system.text; using system.threading.tasks; using system.web; namespace newweb.common { public class validatecode { public validatecode() { } /// <summary> /// 验证码的最大长度 /// </summary> public int maxlength { get { return 10; } } /// <summary> /// 验证码的最小长度 /// </summary> public int minlength { get { return 1; } } /// <summary> /// 生成验证码 /// </summary> /// <param name="length">指定验证码的长度</param> /// <returns></returns> public string createvalidatecode(int length) { int[] randmembers = new int[length]; int[] validatenums = new int[length]; string validatenumberstr = ""; //生成起始序列值 int seekseek = unchecked((int)datetime.now.ticks); random seekrand = new random(seekseek); int beginseek = (int)seekrand.next(0, int32.maxvalue - length * 10000); int[] seeks = new int[length]; for (int i = 0; i < length; i++) { beginseek += 10000; seeks[i] = beginseek; } //生成随机数字 for (int i = 0; i < length; i++) { random rand = new random(seeks[i]); int pownum = 1 * (int)math.pow(10, length); randmembers[i] = rand.next(pownum, int32.maxvalue); } //抽取随机数字 for (int i = 0; i < length; i++) { string numstr = randmembers[i].tostring(); int numlength = numstr.length; random rand = new random(); int numposition = rand.next(0, numlength - 1); validatenums[i] = int32.parse(numstr.substring(numposition, 1)); } //生成验证码 for (int i = 0; i < length; i++) { validatenumberstr += validatenums[i].tostring(); } return validatenumberstr; } /// <summary> /// 创建验证码的图片 /// </summary> /// <param name="context">要输出到的page对象</param> /// <param name="validatenum">验证码</param> public void createvalidategraphic(string validatecode, httpcontext context) { bitmap image = new bitmap((int)math.ceiling(validatecode.length * 12.0), 22); graphics g = graphics.fromimage(image); try { //生成随机生成器 random random = new random(); //清空图片背景色 g.clear(color.white); //画图片的干扰线 for (int i = 0; i < 25; i++) { int x1 = random.next(image.width); int x2 = random.next(image.width); int y1 = random.next(image.height); int y2 = random.next(image.height); g.drawline(new pen(color.silver), x1, y1, x2, y2); } font font = new font("arial", 12, (fontstyle.bold | fontstyle.italic)); lineargradientbrush brush = new lineargradientbrush(new rectangle(0, 0, image.width, image.height), color.blue, color.darkred, 1.2f, true); g.drawstring(validatecode, font, brush, 3, 2); //画图片的前景干扰点 for (int i = 0; i < 100; i++) { int x = random.next(image.width); int y = random.next(image.height); image.setpixel(x, y, color.fromargb(random.next())); } //画图片的边框线 g.drawrectangle(new pen(color.silver), 0, 0, image.width - 1, image.height - 1); //保存图片数据 memorystream stream = new memorystream(); image.save(stream, imageformat.jpeg); //输出图片流 context.response.clear(); context.response.contenttype = "image/jpeg"; context.response.binarywrite(stream.toarray()); } finally { g.dispose(); image.dispose(); } } /// <summary> /// 得到验证码图片的长度 /// </summary> /// <param name="validatenumlength">验证码的长度</param> /// <returns></returns> public static int getimagewidth(int validatenumlength) { return (int)(validatenumlength * 12.0); } /// <summary> /// 得到验证码的高度 /// </summary> /// <returns></returns> public static double getimageheight() { return 22.5; } //c# mvc 升级版 /// <summary> /// 创建验证码的图片 /// </summary> /// <param name="containspage">要输出到的page对象</param> /// <param name="validatenum">验证码</param> public byte[] createvalidategraphic(string validatecode) { bitmap image = new bitmap((int)math.ceiling(validatecode.length * 12.0), 22); graphics g = graphics.fromimage(image); try { //生成随机生成器 random random = new random(); //清空图片背景色 g.clear(color.white); //画图片的干扰线 for (int i = 0; i < 25; i++) { int x1 = random.next(image.width); int x2 = random.next(image.width); int y1 = random.next(image.height); int y2 = random.next(image.height); g.drawline(new pen(color.silver), x1, y1, x2, y2); } font font = new font("arial", 12, (fontstyle.bold | fontstyle.italic)); lineargradientbrush brush = new lineargradientbrush(new rectangle(0, 0, image.width, image.height), color.blue, color.darkred, 1.2f, true); g.drawstring(validatecode, font, brush, 3, 2); //画图片的前景干扰点 for (int i = 0; i < 100; i++) { int x = random.next(image.width); int y = random.next(image.height); image.setpixel(x, y, color.fromargb(random.next())); } //画图片的边框线 g.drawrectangle(new pen(color.silver), 0, 0, image.width - 1, image.height - 1); //保存图片数据 memorystream stream = new memorystream(); image.save(stream, imageformat.jpeg); //输出图片流 return stream.toarray(); } finally { g.dispose(); image.dispose(); } } } }
这时需要在程序中引入两个命名空间 system.drawing和system.web。
完成之后到logincontroller控制器里面去新建一个actionresult 就叫validatecode 用于生成验证码。(这里要先对newweb.common引用)
生成验证码代码如下:
public actionresult validatecode() { common.validatecode validatecode = new common.validatecode(); string code = validatecode.createvalidatecode(4); //生成的验证码4个长度 session["validatecode"] = code; byte[] buffer = validatecode.createvalidategraphic(code);//创建验证码图片 return file(buffer, "image/jpeg");//返回图片 }
到login视图里面的index页面去把img的src补充为:
<tr> <td style="width:20px"></td> <td><img id="image" src="/login/validatecode/?id=1" style="float: left; height: 24px;" /></td> <td><a href="javascript:void(0)" onclick="changecheckcode();return false;">看不清,换一张</a></td> </tr>
就可以看到页面上面显示出来验证码
下面要做的就是点击切换验证码,这是通过js实现的代码
<script type="text/javascript"> $(function () { initwin(); //初始化登录窗体 changecheckcode(); //切换验证码 }); function initwin() { $("#win").window({ title: "登录", width: 400, height: 270, collapsible: false, minimizable: false, maximizable: false, closable: false, modal: true, resizable: false, }); } //切换验证码 function changecheckcode() { $("#changevcode").click(function () { $("#image").attr("src", $("#image").attr("src") + 1); }); } </script>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Net Core Web Api项目与在NginX下发布的方法
asp.net core3.1 引用的元包dll版本兼容性问题解决方案
IdentityServer4实现.Net Core API接口权限认证(快速入门)
ASP.NET Core MVC通过IViewLocationExpander扩展视图搜索路径的实现
网友评论