一聚教程网:一个值得你收藏的教程网站

热门教程

java Servlet 实现动态验证码图片示例

时间:2022-06-29 01:37:36 编辑:袖梨 来源:一聚教程网

整理文档,搜刮出一个java Servlet 实现动态验证码图片的代码,稍微整理精简一下做下分享。

 

 代码如下复制代码

packagecom.hacker;

 

importjava.awt.Color;

importjava.awt.Font;

importjava.awt.Graphics2D;

importjava.awt.image.BufferedImage;

importjava.io.BufferedReader;

importjava.io.ByteArrayOutputStream;

importjava.io.File;

importjava.io.FileOutputStream;

importjava.io.IOException;

importjava.io.OutputStream;

importjava.net.URLEncoder;

importjava.util.Date;

importjava.util.Locale;

importjava.util.Random;

 

importjavax.imageio.ImageIO;

importjavax.servlet.ServletException;

importjavax.servlet.ServletOutputStream;

importjavax.servlet.annotation.WebServlet;

importjavax.servlet.http.HttpServlet;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

importjavax.servlet.http.HttpSession;

 

importcom.bean.Student;

 

 

publicclassHackerServletextendsHttpServlet {

   

   

   //验证码图片的宽度。

     privateintwidth=60;

     //验证码图片的高度。

     privateintheight=20;

@Override

  protectedvoiddoGet(HttpServletRequest req, HttpServletResponse resp)throwsServletException, IOException {

   BufferedImage buffImg=newBufferedImage(width,height,

               BufferedImage.TYPE_INT_RGB);

           Graphics2D g=buffImg.createGraphics();

            

          //创建一个随机数生成器类。

           Random random=newRandom();

           

           g.setColor(Color.WHITE);

           g.fillRect(0,0,width,height);

           

           //创建字体,字体的大小应该根据图片的高度来定。

           Font font=newFont("Times New Roman",Font.PLAIN,18);

           //设置字体。

          g.setFont(font);

            

           //画边框。

           g.setColor(Color.BLACK);

           g.drawRect(0,0,width-1,height-1);

            

           //随机产生160条干扰线,使图象中的认证码不易被其它程序探测到。

           g.setColor(Color.GRAY);

           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用于保存随机产生的验证码,以便用户登录后进行验证。

           StringBuffer randomCode=newStringBuffer();

           intred=0,green=0,blue=0;

            

          //随机产生4位数字的验证码。

          for(inti=0;i<4;i++) {

            //得到随机产生的验证码数字。

            String strRand=String.valueOf(random.nextInt(10));

             

            //产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。

            red=random.nextInt(110);

            green=random.nextInt(50);

            blue=random.nextInt(50);

             

            //用随机产生的颜色将验证码绘制到图像中。

             g.setColor(newColor(red,green,blue));

            g.drawString(strRand,13*i+6,16);

             

             //将产生的四个随机数组合在一起。

            randomCode.append(strRand);

          }

          //将四位数字的验证码保存到Session中。

          HttpSession session=req.getSession();

          session.setAttribute("randomCode",randomCode.toString());

           

           //禁止图像缓存。

          resp.setHeader("Pragma","no-cache");

          resp.setHeader("Cache-Control","no-cache");

          resp.setDateHeader("Expires",0);

           

          resp.setContentType("img/JPG");

           

           //将图像输出到Servlet输出流中。

          ServletOutputStream sos=resp.getOutputStream();

          ImageIO.write(buffImg,"JPG",sos);

          sos.close();

        }

   

 

  }

当然这还需要改进成平常见到的验证码 形式,还需要努力

热门栏目