您的位置:首页 > 编程语言 > Java开发

以文件流的形式生成验证码

2016-02-22 15:32 465 查看
 /****

     * 生成验证码

     * @param request

     * @param response

     */

    @RequestMapping("/imgVerifyCode")

    public void imgVerifyCode(HttpServletRequest request,HttpServletResponse response){

         int width=100;//验证码图片宽度

         int height=40;//验证码图片高度

         BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_3BYTE_BGR);

         Graphics g=image.getGraphics();

         Graphics2D g2d = (Graphics2D) g;

         Random random=new Random();

         g.setColor(Color.white);//背景颜色(或getRandColor(160,250))

         g.fillRect(0, 0, width, height);//画背景

         //g.setColor(getRandColor(0,255));//边框颜色

         //      g.drawRect(0, 0, width-1, height-1);//画边框

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

         g.setColor(getRandColor(160,200));  

          //Stroke stroke=new BasicStroke(3.0f);//设置线宽为3.0

         for(int i=0;i<20;i++){

             int x=random.nextInt(width);

             int y=random.nextInt(height);

             int x1=random.nextInt(20);

             int y1=random.nextInt(20);

             g.drawLine(x,y,x+x1,y+y1);

           //g2d.setStroke(stroke);

         }

        // 随机产生20点,使图象中的认证码不易被其它程序探测到  

          g.setColor(getRandColor(160,200));

          for(int i=0;i<20;i++){

               int x=random.nextInt(width);

               int y=random.nextInt(height);

               g.drawLine(x, y, x, y);

          }

        //随机生成不同的字体、字体样式和字体大小

          String[] fontName = {"微软雅黑","黑体","Georgia","Verdana","Arial","Comic Sans MS","Lucida Console"};

          int [] fontEffect = {Font.PLAIN, Font.ITALIC, Font.BOLD};

          int [] fontSize = {28, 30, 32, 26};

          Font[] fonts = new Font[fontName.length*fontEffect.length*fontSize.length];

          int fontsIndex=0;

          for(String str: fontName){

              for(int effect: fontEffect){

                  for(int size : fontSize){

                      Font font = new Font(str, effect, size);

                      fonts[fontsIndex]=font;

                      fontsIndex = fontsIndex +1;

                  }

              }

          }

          String s="abcdefghijknpqrstuvxyzABCDEFGHJKLNPQRSTUVXYZ23456789"; // 设置备选验证码

          String sRand="";

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

          int length = 4;  // 设置默认生成4个验证码

          for(int i=0;i<length;i++){

          g.setColor(new Color(20+random.nextInt(110), 20+random.nextInt(110), 20+random.nextInt(110))); // 生成随机颜色(因为是做前景,所以偏深)

              g.setFont(fonts[random.nextInt(fonts.length)]);  //调用上方的随机字体

           String ch=String.valueOf(s.charAt(random.nextInt(s.length())));

        //设置字体旋转

           int zhuan = random.nextInt(20);

           int fzhuan = -random.nextInt(20);

              g2d.rotate(Math.toRadians(zhuan),25*(i-1),20);     /// 坐标系顺时针转

              g2d.rotate(Math.toRadians(fzhuan),25*(i-1),20);    /// 坐标系逆时针转

          

              sRand+=ch;

             g.drawString(ch, 18 * i + 15, 30); //将认证码用 drawString 函数显示到图象里

           g2d.rotate(Math.toRadians(-1*zhuan),25*(i-1),20);

           g2d.rotate(Math.toRadians(-1*fzhuan),25*(i-1),20);

          }

          //将生成的字符串存储在session中

          HttpSession session=request.getSession();   

          

        //在认证码的上端画一条不规则的线

          int visit[] = new int[6];  

          for (int i = 0; i < visit.length; i++) {  

              visit[i] = 1 + (int) (Math.random() * 10);  

          }

          int visitValue = 0;  

        g.setColor(Color.BLACK);  

        int drawHigh[] = new int[6];  

        int drawwidth[] = new int[6];  

        //折点坐标  

        for (int i = 0; i < 6; i++) {  

             drawHigh[i] = 40 - (int) (Math.ceil(visit[i] * 3.8));  

             drawwidth[i] = 5 + i * 17;  

        }  

        //g2d.setXORMode(Color.WHITE);

          g2d.setStroke(new BasicStroke(3.0f));  //折线粗细

          g2d.setPaint(Color.gray);//折线的颜色

          g2d.drawPolyline(drawwidth, drawHigh, 6);  //画折线  

          session.setAttribute("checkCode", sRand);

          g.dispose();//图像生效

          //禁止图像缓存

          response.setHeader("Pragma", "No-cache");

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

          response.setDateHeader("Expires", 0);   

          response.setContentType("image/jpeg");

          //创建二进制的输出流

        

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

             try {

                 ServletOutputStream sos=response.getOutputStream();

                   ImageIO.write(image, "jpeg", sos);

                   sos.flush();

                   sos.close();

            } catch (IOException e) {

                e.printStackTrace();

            }

                

        }

        public Color getRandColor(int lower,int upper){

              Random random = new Random();

              if(upper>255)

               upper=255;

              if(upper<1)

               upper=1;

              if(lower<1)

               lower=1;

              if(lower>255)

               lower=255;

              int r=lower+random.nextInt(upper-lower);

              int g=lower+random.nextInt(upper-lower);

              int b=lower+random.nextInt(upper-lower);

              return new Color(r,g,b);
            }

<img src="/home/index/verifyImg" onclick="this.src='/home/index/verifyImg'"  alt="" />
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring mvc