Java中怎么实现一个验证码生成类

  介绍

小编给大家分享一下Java中怎么实现一个验证码生成类,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!

本次和大家分享的是一个集成1:小写拼音2:大写拼音3:数字4:汉字的验证码生成类,从标题来看感觉很普通的样子,没错的确很普通,只是这个验证码类生成的时候可以通过参数指定验证码返回格式的规则,更主要的是希望能给大家带来一定的实用性,本章例子也会有一个mvc使用验证码校验的场景,希望大家能够喜欢。

下面一步一个脚印的来分享:

<强> ?验证码生成流程图

首先,咋们来看一下本次分享的验证码生成类的生成流程图:

癑ava中怎么实现一个验证码生成类"

能看到此图描述的编码生成池对应的是几个不同的编码内容,这里主要根据参数设置允许同时获取不同编码内容,从而到达文字,拼音,汉字组合而成验证码,具体规则设置由参数而定;

<强> ?验证码生成池代码的解析

首先,由上面流程图分析的内容能看的出,这个验证码生成池子需要并行获取不同类型验证码数据,才能满足组合的验证码,因此有了下面的代码:

///& lt; summary>///创建验证码///& lt;/summary>///& lt;参数name=癱odeType"在1:小写拼音2:大写拼音3:数字4:汉字& lt;/param>///& lt; returns> & lt;/returns>
  CreateCode公共静态字符串(字符串codeType=? | 2 | 3 | 4“)
  {
  var代码=string.Empty;
  试一试
  {
  如果(string.IsNullOrWhiteSpace (codeType) | | codeType.IndexOf (& # 39; | & # 39;) & lt;0){codeType=? | 2 | 3 | 4“;}
  var codeTypeArr=codeType。分割(新char [] {& # 39; | & # 39;},StringSplitOptions.RemoveEmptyEntries);
  var strLen=codeTypeArr.Length;//任务
  Task [] taskArr=new Task [strLen];
  for (int i=0;我& lt;strLen;我+ +)
  {
  var val=codeTypeArr[我];
  开关(val)
  {
  “1“://小写拼音
  taskArr[我]=Task.Factory.StartNew(()=比;{返回GetPinYinOrUpper(假);});
  打破;
  案例“2“://大写拼音
  taskArr[我]=Task.Factory.StartNew(()=比;{返回GetPinYinOrUpper ();});
  打破;
  例“3“://数字
  taskArr[我]=Task.Factory.StartNew(()=比;{返回GetShuZi ();});
  打破;
  例“4“://汉字
  taskArr[我]=Task.Factory.StartNew(()=比;{返回GetHanZi ();});
  打破;
  默认值:
  打破;
  }
  }//等待完成30年代
  的任务。WaitAll (taskArr TimeSpan.FromSeconds (30));
  foreach (var taskArr项)
  {
  代码+=item.Result;
  }
  }
  捕获(异常交货)
  {
  代码=拔野婀?
  }
  返回码;
  }

这里继续使用了关键字任务,来分发任务获取不同的验证码内容,个人认为最主要的还是通过参数设置,来确定验证码的组合方式,这样也达到了验证码格式的多样性;

<强> ?把验证代码画到图片上

首先,咋们要明确的是要吧文字画在某个图片上,那么需要用到图形关键字,以此来创建画布把咋们的验证编码画到图片上,这里先上代码:

///& lt; summary>///生成验证码图片流///& lt;/summary>///& lt;参数name=癱ode"在验证码文字& lt;/param>///& lt; returns>流& lt;/returns>
  公共静态byte [] CreateValidateCodeStream(字符串代码=拔野婀?int字形大?18,int宽度=0,int高度=0,字符串fontFamily=盎目濉?
  {
  var bb [0]=new字节;//初始化画布
  var填充=2;
  var len=code.Length;
  宽度=宽度& lt;=0 ?字形大小* 2 * (len - 1) +填充* 4:宽度;
  身高=身高& lt;=0 ?字形大小* 2:高度;
  var=new形象图(宽度、高度);
  var g=Graphics.FromImage(图片);
  试一试
  {
  var随机=new随机();//清空背景色
  g.Clear (Color.White);//画横向中间干扰线
  var x1=0;
  var日元=身高/2;
  var x2=宽度;
  var y2=y?;
  g。画直线(新钢笔(Color.DarkRed) (x1, y1, x2, y2);//字体
  var字体=new字体(fontFamily、字形大小(FontStyle。大胆| FontStyle.Italic));
  var=new LinearGradientBrush刷(新矩形(0,0,形象。宽度,image.Height),
  颜色。蓝色,颜色。DarkRed 1 f,真实);//画文字
  var stringFomart=new StringFormat ();//垂直居中
  stringFomart。LineAlignment=StringAlignment.Center;//水平居中
  stringFomart。对齐=StringAlignment.Center;
  var射频=new矩形(点。空的,新的大小(宽度、高度));
  g。拉带(代码、字体、画笔、射频stringFomart);//画图片的前景干扰点
  for (int i=0;我& lt;100;我+ +)
  {
  var x=random.Next (image.Width);
  var y=random.Next (image.Height);
  的形象。SetPixel (x, y, Color.FromArgb (random.Next ()));
  }//画图片的边框线
  g。DrawRectangle(新钢笔(Color.Silver), 0, 0,形象。宽度- 1,形象。高度- 1);//保存图片流
  var流=new MemoryStream ();
  的形象。保存(流,ImageFormat.Jpeg);//输出图片流
  bb=stream.ToArray ();
  }
  捕获(异常交货){}
  最后
  {
  g.Dispose ();
  image.Dispose ();
  }
  返回bb;
  }

Java中怎么实现一个验证码生成类