首页 > 代码库 > 生成随机验证码工具类

生成随机验证码工具类

生成随机验证码

package com.web;//验证码生成处理类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;import com.tools.MD5;public class PictureCheckCode 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=100;        int height=40;        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",MD5.code(randCode.toLowerCase()));                g.dispose();                ImageIO.write(image,"JPEG",response.getOutputStream());            }}

 

生成随机验证码工具类