• JAVA生成验证码


    <img border="0"
                                src
    ="ValidateCode"
                                id
    ='code' width="64" height="30" 
                                style
    ="vertical-align: top; cursor: pointer;"
                                 title
    ="点击刷新验证码" />

     

     JAVA代码:

    import java.awt.BasicStroke;
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.geom.AffineTransform;
    import java.awt.geom.Line2D;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.util.Random;
    import javax.imageio.ImageIO;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;

    public class ValidateCode extends HttpServlet {

         private static final long serialVersionUID = 1L;
         
         private Random rand=new Random();
         
         
         /**
          * 生成随机颜色
          * 
          * 
    @param   start  [int]
          * 
    @param   end    [int]
          * 
    @return  Color  [object]
          
    */
         public Color getRandColor(int start,int end){
          int randNum;
          if(start>255) start=255;
          if(end>255) end=255;
          if(start>end) randNum=start-end;
          else randNum=end-start;
          int r=start+rand.nextInt(randNum); 
          int g=start+rand.nextInt(randNum);
          int b=start+rand.nextInt(randNum);
          return new Color(r,g,b);
         }
         
         /**
          * 着色旋转缩放
          * 
          * 
    @param word 文字
          * 
    @param g    图片对象
          
    */
         public void coloredAndRotation(String word,int i,Graphics g){
          /**着色**/
          g.setColor(new Color(20+rand.nextInt(110),20+rand.nextInt(110),20+rand.nextInt(110)));
          /**旋转**/
          Graphics2D g2d=(Graphics2D)g;
          AffineTransform trans=new AffineTransform();
          trans.rotate(rand.nextInt(45)*3.14/180,15*i+8,7);
          /**缩放**/
          float scaleSize=rand.nextFloat()+0.8f;
          if(scaleSize>1f) scaleSize=1f;
          trans.scale(scaleSize, scaleSize);
          g2d.setTransform(trans);
          g.drawString(word,15*i+20,20);
         }
         
         /**
          * 生成100条干扰线
          * 
          * 
    @param g2d
          * 
    @param width
          * 
    @param height
          
    */
         public void getRandLine(Graphics2D g2d,int width,int height){
          for(int i=0;i<100;i++){
           int x=rand.nextInt(width-1);
           int y=rand.nextInt(height-1);
           int z=rand.nextInt(6)+1;
           int w=rand.nextInt(12)+1;
           
           BasicStroke bs=new BasicStroke(2f,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL);
           Line2D line=new Line2D.Double(x,y,x+z,y+w);
           g2d.setStroke(bs);
           g2d.draw(line);
          }
         }
         
         /**
          * 获取随机文字
          * 
    @param  length [int]        验证码长度
          * 
    @param  g      [Graphics]   图片对象
          * 
    @return String
          * @case1:A-Z
          * @case2:chinese
          * @default:0-9
          
    */
         @SuppressWarnings("unused")
         public String getRandWord(int length,Graphics g){
          String finalWord="",firstWord="";
          int tempInt=0;
          String[] array={
            "0","1","2","3",
            "4","5","6","7",
            "8","9","a","b",
            "c","d","e","f"};
          
          for(int i=0;i<length;i++){
           switch(rand.nextInt(2)){
           //英文数字混合
           /* case 1:
              tempInt=rand.nextInt(26)+65;
              firstWord=String.valueOf((char)tempInt);
              break;
    */
           //纯数字
            case 2:
              int r1,r2,r3,r4;
              String strH,strL;//high&low
              r1=rand.nextInt(3)+11; //前闭后开[11,14)
              if(r1==13){
               r2=rand.nextInt(7);
              }else{
               r2=rand.nextInt(16);
              }
              
              r3=rand.nextInt(6)+10;
              if(r3==10){
               r4=rand.nextInt(15)+1;
              }else if(r3==15){
               r4=rand.nextInt(15);
              }else{
               r4=rand.nextInt(16);
              }
              
              strH=array[r1]+array[r2];
              strL=array[r3]+array[r4];
              
              byte[] bytes=new byte[2];
              bytes[0]=(byte)(Integer.parseInt(strH,16));
              bytes[1]=(byte)(Integer.parseInt(strL,16));
              
              firstWord=new String(bytes);
              break;
            default:
              tempInt=rand.nextInt(10)+48;
              firstWord=String.valueOf((char)tempInt);
              break;
           }
           finalWord+=firstWord;
           this.coloredAndRotation(firstWord,i, g);
          }
          
          return finalWord;
         }

         protected void service(HttpServletRequest request, HttpServletResponse response)
           throws ServletException, IOException {
          
          //设制不缓存图片
          response.setHeader("Pragma","No-cache");
          response.setHeader("Cache-Control","No-cache");
          response.setDateHeader("Expires",0);
          
          //生成图片
          response.setContentType("image/jpeg");
          int width=80;
          int height=30;
          BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
          
          Graphics g=image.getGraphics();
          Graphics2D g2d=(Graphics2D)g;
          Font mFont=new Font("宋体",Font.BOLD,22);
          g.setColor(this.getRandColor(200,250));
          g.fillRect(0, 0, width, height);
          g.setFont(mFont);
          g.setColor(this.getRandColor(180,200));
          
          this.getRandLine(g2d, width, height);
          
          String randCode=this.getRandWord(4, g);
          
          HttpSession session=request.getSession();
          session.setAttribute("randCode",randCode);
          
          g.dispose();
          
          ImageIO.write(image,"JPEG",response.getOutputStream());
          
         }
    }
  • 相关阅读:
    .NET视频学习总结
    hdu5288(2015多校1)OO’s Sequence
    【Go web开发之revel+mgo】第1章 述与环境
    Android获得当前系统时间、星期几、周几
    夯实Java:从面向对象说起
    centos7 安装nginx
    centos7 安装nginx
    centos7 安装nginx
    element-ui中cascader同时获取label和value值
    element-ui中cascader同时获取label和value值
  • 原文地址:https://www.cnblogs.com/wuxiang/p/3370970.html
Copyright © 2020-2023  润新知