zl程序教程

您现在的位置是:首页 >  后端

当前栏目

解析Java实现随机验证码功能的方法详解

JAVA方法 实现 详解 解析 功能 随机 验证码
2023-06-13 09:14:54 时间
现在许多系统的注册、登录或者发布信息模块都添加的随机码功能,就是为了避免自动注册程序或者自动发布程序的使用。
验证码实际上就是随机选择一些字符以图片的形式展现在页面上,如果进行提交操作的同时需要将图片上的字符同时提交,如果提交的字符与服务器session保存的不同,则认为提交信息无效。为了避免自动程序分析解析图片,通常会在图片上随机生成一些干扰线或者将字符进行扭曲,增加难度。   
我们可以使用servlet来实现随机验证码的实现。
复制代码代码如下:

packagecom.servlet;
   importjava.awt.Color;
   importjava.awt.Font;
   importjava.awt.Graphics2D;
   importjava.awt.image.BufferedImage;
   importjava.util.Random;
   importjavax.imageio.ImageIO;
   importjavax.servlet.ServletException;
   importjavax.servlet.ServletOutputStream;
   importjavax.servlet.http.HttpServlet;
   importjavax.servlet.http.HttpServletRequest;
   importjavax.servlet.http.HttpServletResponse;
   importjavax.servlet.http.HttpSession;
   /**
   *生成随机验证码
   *@authorbitiliu
   *
   */
   publicclassValidateCodeServletextendsHttpServlet
   {
   privatestaticfinallongserialVersionUID=1L;
   //验证码图片的宽度。
   privateintwidth=60;
   //验证码图片的高度。
   privateintheight=20;
   //验证码字符个数
   privateintcodeCount=4;
   privateintx=0;
   //字体高度
   privateintfontHeight;
   privateintcodeY;
   char[]codeSequence={"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","0","1","2","3","4","5","6","7","8","9"};
   /**
   *初始化验证图片属性
   */
   publicvoidinit()throwsServletException
   {
   //从web.xml中获取初始信息
   //宽度
   StringstrWidth=this.getInitParameter("width");
   //高度
   StringstrHeight=this.getInitParameter("height");
   //字符个数
   StringstrCodeCount=this.getInitParameter("codeCount");
   //将配置的信息转换成数值
   try
   {
   if(strWidth!=null&&strWidth.length()!=0)
   {
   width=Integer.parseInt(strWidth);
   }
   if(strHeight!=null&&strHeight.length()!=0)
   {
   height=Integer.parseInt(strHeight);
   }
   if(strCodeCount!=null&&strCodeCount.length()!=0)
   {
   codeCount=Integer.parseInt(strCodeCount);
   }
   }
   catch(NumberFormatExceptione)
   {}
   x=width/(codeCount+1);
   fontHeight=height-2;
   codeY=height-4;
   }
   protectedvoidservice(HttpServletRequestreq,HttpServletResponseresp)
   throwsServletException,java.io.IOException{
   //定义图像buffer
   BufferedImagebuffImg=newBufferedImage(
   width,height,BufferedImage.TYPE_INT_RGB);
   Graphics2Dg=buffImg.createGraphics();
   //创建一个随机数生成器类
   Randomrandom=newRandom();
   //将图像填充为白色
   g.setColor(Color.WHITE);
   g.fillRect(0,0,width,height);
   //创建字体,字体的大小应该根据图片的高度来定。
   Fontfont=newFont("Fixedsys",Font.PLAIN,fontHeight);
   //设置字体。
   g.setFont(font);
   //画边框。
   g.setColor(Color.BLACK);
   g.drawRect(0,0,width-1,height-1);
   //随机产生160条干扰线,使图象中的认证码不易被其它程序探测到。
  g.setColor(Color.BLACK);
   for(inti=0;i<160;i++)
   {
   intx=random.nextInt(width);
   inty=random.nextInt(height);
   intxl=random.nextInt(12);
   intyl=random.nextInt(12);
   g.drawLine(x,y,x+xl,y+yl);
   }
   //randomCode用于保存随机产生的验证码,以便用户登录后进行验证。
   StringBufferrandomCode=newStringBuffer();
   intred=0,green=0,blue=0;
   //随机产生codeCount数字的验证码。
   for(inti=0;i<codeCount;i++){
   //得到随机产生的验证码数字。
   StringstrRand=String.valueOf(codeSequence[random.nextInt(36)]);
   //产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。
   red=random.nextInt(255);
   green=random.nextInt(255);
   blue=random.nextInt(255);
   //用随机产生的颜色将验证码绘制到图像中。
   g.setColor(newColor(red,green,blue));
   g.drawString(strRand,(i+1)*x,codeY);
   //将产生的四个随机数组合在一起。
   randomCode.append(strRand);
   }
   //将四位数字的验证码保存到Session中。
   HttpSessionsession=req.getSession();
   session.setAttribute("validateCode",randomCode.toString());
   //禁止图像缓存。
   resp.setHeader("Pragma","no-cache");
   resp.setHeader("Cache-Control","no-cache");
   resp.setDateHeader("Expires",0);
   resp.setContentType("image/jpeg");
   //将图像输出到Servlet输出流中。
   ServletOutputStreamsos=resp.getOutputStream();
   ImageIO.write(buffImg,"jpeg",sos);
   sos.close();
   }
   }

需要在web.xml中声明servlet
复制代码代码如下:

<servlet>
   <servlet-name>ValidateCodeServlet</servlet-name>
   <servlet-class>com.servlet.ValidateCodeServlet</servlet-class>
   <init-param>
   <param-name>width</param-name>
   <param-value>200</param-value>
   </init-param>
   <init-param>
   <param-name>height</param-name>
   <param-value>80</param-value>
   </init-param>
   <init-param>
   <param-name>codeCount</param-name>
   <param-value>5</param-value>
   </init-param>
   </servlet>
   <servlet-mapping>
   <servlet-name>ValidateCodeServlet</servlet-name>
   <url-pattern>/validateCodeServlet</url-pattern>
   </servlet-mapping>