图文验证码生成器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chen_pt/article/details/78729054

package com.cpt.util;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

/**
* 版权所有(C) 2017
* 描述:
* 作者: chen_pt
* 创建日期: 2017/12/6
* 修改记录:
*/
public class ValidateCodeUtil {

private final static int width = 90;//定义图片的width
private final static int height = 20;//定义图片的height
private final static int codeCount = 4;//定义图片上显示验证码的个数
private final static int xx = 15;
private final static int fontHeight = 18;
private final static int codeY = 16;
private final static char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
        'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W','W',
        'X', 'Y', 'Z', '1', '2', '3', '4', '5', '6', '7', '8', '9','9' };
static char[] codeSequenceNum = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};

public static void getCode(HttpServletRequest req, HttpServletResponse resp)
        throws IOException {

    // 定义图像buffer
    BufferedImage buffImg = new BufferedImage(width, height,
            BufferedImage.TYPE_INT_RGB);
    //  Graphics2D gd = buffImg.createGraphics();
    //Graphics2D gd = (Graphics2D) buffImg.getGraphics();
    Graphics gd = buffImg.getGraphics();
    // 创建一个随机数生成器类
    Random random = new Random();
    // 将图像填充为白色
    gd.setColor(Color.WHITE);
    gd.fillRect(0, 0, width, height);

    // 创建字体,字体的大小应该根据图片的高度来定。
    Font font = new Font("Fixedsys", Font.BOLD, fontHeight);
    // 设置字体。
    gd.setFont(font);

    // 画边框。
    gd.setColor(Color.BLACK);
    gd.drawRect(0, 0, width - 1, height - 1);

    // 随机产生40条干扰线,使图象中的认证码不易被其它程序探测到。
    gd.setColor(Color.BLACK);
    //绘制干扰线
    for(int i=0;i<10;i++){
        gd.setColor(getRandColor(130, 200));
        int x = random.nextInt(width);
        int y = random.nextInt(height);
        int x1 = random.nextInt(12);
        int y1 = random.nextInt(12);
        gd.drawLine(x, y, x + x1, y + y1);
    }

    // randomCode用于保存随机产生的验证码,以便用户登录后进行验证。
    StringBuffer randomCode = new StringBuffer();
    int red = 0, green = 0, blue = 0;

    // 随机产生codeCount数字的验证码。
    for (int i = 0; i < codeCount; i++) {
        // 得到随机产生的验证码数字。
        String code = String.valueOf(codeSequence[random.nextInt(36)]);
        // 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。
        red = random.nextInt(255);
        green = random.nextInt(255);
        blue = random.nextInt(255);

        // 用随机产生的颜色将验证码绘制到图像中。
        gd.setColor(new Color(red, green, blue));
        gd.drawString(code, (i + 1) * xx, codeY);

        // 将产生的四个随机数组合在一起。
        randomCode.append(code);
    }
    // 将四位数字的验证码保存到Session中。
    HttpSession session = req.getSession();

// System.out.print(randomCode);
session.setAttribute(“code”, randomCode.toString());

    // 禁止图像缓存。
    resp.setHeader("Pragma", "no-cache");
    resp.setHeader("Cache-Control", "no-cache");
    resp.setDateHeader("Expires", 0);

    resp.setContentType("image/jpeg");

    // 将图像输出到Servlet输出流中。
    ServletOutputStream sos = resp.getOutputStream();
    ImageIO.write(buffImg, "jpeg", sos);
    sos.close();
}
public static Color getRandColor(int fc,int bc){
    Random random = new Random();
    if(fc>255)
        fc = 255;
    if(bc>255)
        bc = 255;
    int r = fc + random.nextInt(bc - fc);
    int g = fc + random.nextInt(bc - fc);
    int b = fc + random.nextInt(bc - fc);
    return new Color(r,g,b);
}

public static String getCode(int codesize){
    Random random = new Random();
    StringBuffer vcode = new StringBuffer();
    for (int i = 0;i<codesize;i++){
        String code = String.valueOf(codeSequenceNum[random.nextInt(10)]);
        vcode.append(code);
    }
    return vcode.toString();
}

}

展开阅读全文

没有更多推荐了,返回首页