分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 教程案例

MVC中登录页图片验证码总结

发布时间:2023-09-06 01:47责任编辑:沈小雨关键词:MVC验证码

直接上代码了

 后台代码:

using System;using System.Collections.Generic;using System.Drawing;using System.Drawing.Imaging;using System.IO;using System.Linq;using System.Web;using System.Web.Mvc;namespace Manage.Controllers{public class ValidateCodeController : Controller{//// GET: /ValidateCode/public FileContentResult GetCode(){//string code = GetRndStr();string code = GetNumAndStr(4);byte[] imageByte;using (Bitmap img = CreateImages(code, "ch")){imageByte = BitmapToByte(img);Session["validate"] = code;}return File(imageByte, "image/gif"); }public static byte[] BitmapToByte(Bitmap bitmap){using (MemoryStream stream = new MemoryStream()){bitmap.Save(stream, ImageFormat.Jpeg);byte[] data = new byte[stream.Length];stream.Seek(0, SeekOrigin.Begin);stream.Read(data, 0, Convert.ToInt32(stream.Length));return data;}}public bool IsReusable{get{return false;}}/// <summary>/// 数字随机数/// </summary>/// <returns></returns>private string GetRndNum(){string code = string.Empty;Random random = new Random();for (int i = 0; i < 4; i++){code += random.Next(9);}return code;}/// <summary>/// 英文随机/// </summary>/// <returns></returns>private string GetRndStr(){string Vchar = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z";string[] VcArray = Vchar.Split(‘,‘);string checkCode = string.Empty;Random rand = new Random();for (int i = 0; i < 4; i++){int t = rand.Next(VcArray.Length);checkCode += VcArray[t];}return checkCode;}/// <summary>/// 中文随机/// </summary>/// <returns></returns>private string GetRndCh(){System.Text.Encoding gb = System.Text.Encoding.Default;//获取GB2312编码页(表)object[] bytes = CreateRegionCode(4);//生4个随机中文汉字编码string[] str = new string[4];System.Text.StringBuilder sb = new System.Text.StringBuilder();for (int i = 0; i < 4; i++){//根据汉字编码的字节数组解码出中文汉字str[i] = gb.GetString((byte[])Convert.ChangeType(bytes[i], typeof(byte[])));sb.Append(str[i].ToString());}return sb.ToString();}/// <summary>/// 产生随机中文字符/// </summary>/// <param name="strlength"></param>/// <returns></returns>private static object[] CreateRegionCode(int strlength){//定义一个字符串数组储存汉字编码的组成元素string[] rBase = new String[16] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };Random rnd = new Random();object[] bytes = new object[strlength];for (int i = 0; i < strlength; i++){//区位码第1位int r1 = rnd.Next(11, 14);string str_r1 = rBase[r1].Trim();//区位码第2位rnd = new Random(r1 * unchecked((int)DateTime.Now.Ticks) + i);int r2;if (r1 == 13){r2 = rnd.Next(0, 7);}else{r2 = rnd.Next(0, 16);}string str_r2 = rBase[r2].Trim();//区位码第3位rnd = new Random(r2 * unchecked((int)DateTime.Now.Ticks) + i);//更换随机种子int r3 = rnd.Next(10, 16);string str_r3 = rBase[r3].Trim();//区位码第4位rnd = new Random(r3 * unchecked((int)DateTime.Now.Ticks) + i);int r4;if (r3 == 10){r4 = rnd.Next(1, 16);}else if (r3 == 15){r4 = rnd.Next(0, 15);}else{r4 = rnd.Next(0, 16);}string str_r4 = rBase[r4].Trim();//定义两个字节变量存储产生的随机汉字区位码byte byte1 = Convert.ToByte(str_r1 + str_r2, 16);byte byte2 = Convert.ToByte(str_r3 + str_r4, 16);//将两个字节变量存储在字节数组中byte[] str_r = new byte[] { byte1, byte2 };//将产生的一个汉字的字节数组放入object数组中bytes.SetValue(str_r, i);}return bytes;}public string GetNumAndStr(int length){string str = string.Empty;string Vchar = "0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p" +",q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q" +",R,S,T,U,V,W,X,Y,Z";string[] VcArray = Vchar.Split(new Char[] { ‘,‘ });//拆分成数组string[] num = new string[length];int temp = -1;//记录上次随机数值,尽量避避免生产几个一样的随机数Random rand = new Random();//采用一个简单的算法以保证生成随机数的不同for (int i = 1; i < length + 1; i++){if (temp != -1){rand = new Random(i * temp * unchecked((int)DateTime.Now.Ticks));}int t = rand.Next(61);temp = t;str += VcArray[t];// num[i - 1] = VcArray[t]; } return str;}/// <summary>/// 画图片的背景图+干扰线 /// </summary>/// <param name="checkCode"></param>/// <returns></returns>private Bitmap CreateImages(string checkCode, string type){int step = 0;if (type == "ch"){step = 5;//中文字符,边界值做大}int iwidth = (int)(checkCode.Length * (13 + step));System.Drawing.Bitmap image = new System.Drawing.Bitmap(iwidth, 22);Graphics g = Graphics.FromImage(image);g.Clear(Color.White);//清除背景色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", "宋体" };Random rand = new Random();for (int i = 0; i < 50; i++){int x1 = rand.Next(image.Width);int x2 = rand.Next(image.Width);int y1 = rand.Next(image.Height);int y2 = rand.Next(image.Height);g.DrawLine(new Pen(Color.LightGray, 1), x1, y1, x2, y2);//根据坐标画线}for (int i = 0; i < checkCode.Length; i++){int cindex = rand.Next(7);int findex = rand.Next(5);Font f = new System.Drawing.Font(font[findex], 10, System.Drawing.FontStyle.Bold);Brush b = new System.Drawing.SolidBrush(c[cindex]);int ii = 4;if ((i + 1) % 2 == 0){ii = 2;}g.DrawString(checkCode.Substring(i, 1), f, b, 3 + (i * (12 + step)), ii);}g.DrawRectangle(new Pen(Color.Silver, 0), 0, 0, image.Width - 1, image.Height - 1);System.IO.MemoryStream ms = new System.IO.MemoryStream();return image;}}}
View Code

前台页面:

 <img id="imgCode" onclick="CodeChange();" style="cursor: pointer; height: 40px; width: 105.3px; margin-bottom:-14px;margin-top:0px; margin-right:0px;" title="看不清?" /> 

$(function () {
$("#imgCode").attr("src", "/ValidateCode/GetCode?t=" + (new Date()).valueOf());
})

// 更换图片验证码
function CodeChange() {
var imgNode = $("#imgCode");
imgNode.attr("src", "/ValidateCode/GetCode?t=" + (new Date()).valueOf());
}

 FileContentResult类型的返回一个图片文件

本文原文来自:https://www.cnblogs.com/huaqiqi/p/5859458.html

MVC中登录页图片验证码总结

原文地址:https://www.cnblogs.com/lxf1117/p/8663063.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved