servlet生成验证码

来源:互联网 发布:写软文用什么软件 编辑:程序博客网 时间:2024/05/08 02:40

写个验证码玩玩

servlet生成验证码

主要用到3个对对象
BufferedImage 图像buffer
Graphics2D 图片对象
ImageIO 输出图片

private static final int WIDTH = 120;//图片宽度
private static final int HEIGHT = 25;//图片高度
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    createImager(request,response);
}


private void createImager(HttpServletRequest request, HttpServletResponse response) {
    BufferedImage image = new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_RGB);
    Graphics g = image.getGraphics();
    setNoCache(response);//页面不缓存
    try {
        setBackgroup(g);//设置背景颜色
        setBorder(g);//设置边框
        drawLine(g);//生成干扰线
        drawNum(g);//生成随即数,字体旋转
        dispose(g);//释放资源
        ImageIO.write(image, "JPEG", response.getOutputStream());
    } catch (IOException e) {
        e.printStackTrace();
    }
}

//生成干扰线
private void drawLine(Graphics g) {
    for(int i=0;i<4;i++){
        g.setColor(new Color(new Random().nextInt(255),new Random().nextInt(255),new Random().nextInt(255)));//干扰线颜色
        g.drawLine(0, new Random().nextInt(25), WIDTH,new Random().nextInt(25));//画干扰线
    }
}


//生成随机字符
private void drawNum(Graphics g) {
    Graphics2D g2d = (Graphics2D)g;
    String str []= {"宋","体","的","一","是","在","出","体","就","分","成","国",
            "标","表","不","客","内","日","中","得"};
    g2d.setFont(new Font("宋体",Font.BOLD,20));//设置字体
    Random random = new Random();
    g2d.setColor(Color.BLACK);//设置字体颜色
    for(int i=0;i<4;i++){//生成4为随机字符
        int n = random.nextInt()%30;//字体旋转角度
        double d = n*Math.PI/180;//字体旋转弧度
        //字体旋转
        g2d.rotate(d,i*20+15, 20);//根据当前字符旋转弧度
        String num = str[random.nextInt(str.length)];
        g2d.drawString(num, i*20+15, 20);
        g2d.rotate(-d,i*20+15, 20);//旋转弧度复位
    }
}


//页面不缓存
private void setNoCache(HttpServletResponse response) {
    response.addHeader("Expires", "-1");
    response.addHeader("Cache-Control", "no-cache");
    response.addHeader("Pragma", "no-cache");
}

//设置边框
private void setBorder(Graphics g) {
    g.setColor(Color.GRAY);
    g.drawRect(1, 1, WIDTH-2, HEIGHT-2);
}

//释放资源
private void dispose(Graphics g) {
    g.dispose();
}

//设置背景颜色
private void setBackgroup(Graphics g) {
    g.setColor(Color.GRAY);
    g.fillRect(0, 0, WIDTH, HEIGHT);
}

原创粉丝点击