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

 /****
     * 生成验证码
     * @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" οnclick="this.src='/home/index/verifyImg'"  alt="" /> 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值