NET7下显示验证码
NET7下显示验证码
nuget:Zkweb.system.drawing
mac 下显示验证码还得 nuget:runtime.osx.10.10-x64.CoreCompat.System.Drawing
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | public class VierificationCodeServices { /// <summary> /// 该方法用于生成指定位数的随机数 /// </summary> /// <param name="VcodeNum">参数是随机数的位数</param> /// <returns>返回一个随机数字符串</returns> public string RndNum( int VcodeNum) { //验证码可以显示的字符集合 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,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,P,P,Q" + ",R,S,T,U,V,W,X,Y,Z" ; string [] VcArray = Vchar.Split( new Char[] { ',' }); //拆分成数组 string code = "" ; //产生的随机数 int temp = -1; //记录上次随机数值,尽量避避免生产几个一样的随机数 Random rand = new Random(); //采用一个简单的算法以保证生成随机数的不同 for ( int i = 1; i < VcodeNum + 1; i++) { if (temp != -1) { rand = new Random(i * temp * unchecked (( int )DateTime.Now.Ticks)); //初始化随机类 } int t = rand.Next(61); //获取随机数 if (temp != -1 && temp == t) { return RndNum(VcodeNum); //如果获取的随机数重复,则递归调用 } temp = t; //把本次产生的随机数记录起来 code += VcArray[t]; //随机数的位数加一 } return code; } /// <summary> /// 该方法是将生成的随机数写入图像文件 nuget:Zkweb.system.drawing /// mac 下显示验证码还得 nuget:runtime.osx.10.10-x64.CoreCompat.System.Drawing /// </summary> /// <param name="code">code是一个随机数</param> /// <param name="numbers">生成位数(默认4位)</param> public MemoryStream CreateYZM( out string code, int numbers = 4) { code = RndNum(numbers); Bitmap Img = null ; Graphics g = null ; MemoryStream ms = null ; Random random = new Random(); //验证码颜色集合 Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple }; //验证码字体集合 string [] fonts = { "Verdana" , "Microsoft Sans Serif" , "Comic Sans MS" , "Arial" , "宋体" }; //定义图像的大小,生成图像的实例 Img = new Bitmap(( int )code.Length * 18, 32); g = Graphics.FromImage(Img); //从Img对象生成新的Graphics对象 g.Clear(Color.White); //背景设为白色 //在随机位置画背景点 for ( int i = 0; i < 100; i++) { int x = random.Next(Img.Width); int y = random.Next(Img.Height); g.DrawRectangle( new Pen(Color.LightGray, 0), x, y, 1, 1); } //验证码绘制在g中 for ( int i = 0; i < code.Length; i++) { int cindex = random.Next(7); //随机颜色索引值 int findex = random.Next(5); //随机字体索引值 Font f = new Font(fonts[findex], 15, FontStyle.Bold); //字体 Brush b = new SolidBrush(c[cindex]); //颜色 int ii = 4; if ((i + 1) % 2 == 0) //控制验证码不在同一高度 { ii = 2; } g.DrawString(code.Substring(i, 1), f, b, 3 + (i * 12), ii); //绘制一个验证字符 } ms = new MemoryStream(); //生成内存流对象 Img.Save(ms, ImageFormat.Jpeg); //将此图像以Png图像文件的格式保存到流中 //回收资源 g.Dispose(); Img.Dispose(); return ms; } } |
前台使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | //注入 builder.Services.AddSingleton<Util.VierificationCodeServices>( new Util.VierificationCodeServices()); //html使用 <img id= "imgcode" src= "/Home2/Genyzm" onclick= "changecode()" /> //控制器后端代码,需要用到session,记得nuget包,不过好像NET7中把那个NUGET包废弃了,但还能用 /// <summary> /// 图形验证码 /// </summary> /// <returns></returns> public IActionResult GenYZM([FromServices] VierificationCodeServices _vierificationCodeServices) { string code = "" ; System.IO.MemoryStream ms = _vierificationCodeServices.CreateYZM( out code); HttpContext.Session.SetString( "Code" , code); Response.Body.Dispose(); return File(ms.ToArray(), @"image/png" ); } |
撸码:复制、粘贴,拿起键盘就是“干”!!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具