BaseCaptcha 代码实现

package com.hanhanfilm.common.captcha.bean;

import com.hanhanfilm.common.captcha.CaptchaUtils;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.Random;

/**
 * https://www.hanhanfilm.com
 * Created by badouyuren.
 */
public class BaseCaptcha implements Captcha {

    protected final int imgWidth;
    protected final int imgHeight;
    protected final BufferedImage captchaImage;
    protected final int randomCodeNum;// 随机生成字符数量
    protected final int RANDOM_CODE_MIN_NUM = 4;// 随机生成字符最小数量
    protected final String randomCode;//生成的随机码
    protected final String md5RandomCode;//md5散列后的随机码

    protected BaseCaptcha(int randomCodeNum) {
        if (randomCodeNum < RANDOM_CODE_MIN_NUM) {
            randomCodeNum = RANDOM_CODE_MIN_NUM;
        }

        String className = getClass().getSimpleName();
        if (className.equals("ColorfulCaptcha")) {
            this.imgWidth = 16 * randomCodeNum + 12;
            this.imgHeight = 26;
        }else if(className.equals("JfinalCaptcha")){
            this.imgWidth = 23 * randomCodeNum + 12;
            this.imgHeight = 40;
        }else{
            this.imgWidth = 27 * randomCodeNum + 12;
            this.imgHeight = 40;
        }


        this.randomCodeNum = randomCodeNum;
        this.randomCode = generateRandomCode();
        this.md5RandomCode = CaptchaUtils.encrypt(randomCode);
        this.captchaImage = drawGraphic();
    }


    /**
     * 依据字典生成随即码
     * 该方法需要由子类来实现
     * @return 随机码
     */
    public String generateRandomCode() {
        return null;
    }


    /**
     * 依据字典生成随即码
     * 该方法需要由子类来实现
     * @return 随机码
     */
    @Override
    public BufferedImage drawGraphic() {
        return null;
    }


    /**
     * 获得生成的验证码的md5值
     *
     * @return 随机码
     */
    @Override
    public String getMd5RandomCode() {
        return this.md5RandomCode;
    }


    /**
     * 获得生成的验证码图片流
     *
     * @return 验证码图片流
     */
    @Override
    public BufferedImage getCaptchaImage() {
        return captchaImage;
    }


    /**
     * 生成随机颜色
     *
     * @param fc
     * @param bc
     * @return 颜色对象
     */
    public 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);
    }


    /**
     * 随机产生定义的颜色
     *
     * @return
     */
    public Color getRandomColor() {
        Random random = new Random();
        Color color[] = new Color[10];
        color[0] = new Color(32, 158, 25);
        color[1] = new Color(218, 42, 19);
        color[2] = new Color(31, 75, 208);
        return color[random.nextInt(3)];
    }


    /**
     * 产生随机字体
     *
     * @return
     */
    public Font getRandomFont() {
        Random random = new Random();
        Font[] font = new Font[]{
                new Font("nyala", Font.BOLD, 38),
                new Font("Arial", Font.BOLD, 32),
                new Font("Bell MT", Font.BOLD, 32),
                new Font("Credit valley", Font.BOLD, 34),
                new Font("Impact", Font.BOLD, 32),
                new Font(Font.MONOSPACED, Font.BOLD, 40)
        };
        return font[random.nextInt(6)];
    }

}


评论区

goooto

2016-07-15 16:05

站点源码能分享出来吗 学习一下~

热门分享

扫码入社