package com.walker.support.kaptcha; import com.google.code.kaptcha.impl.DefaultKaptcha; import com.google.code.kaptcha.util.Config; import com.walker.web.CaptchaProvider; import com.walker.web.CaptchaResult; import com.walker.web.CaptchaType; import java.awt.image.BufferedImage; import java.util.Properties; import static com.google.code.kaptcha.Constants.KAPTCHA_BORDER; import static com.google.code.kaptcha.Constants.KAPTCHA_BORDER_COLOR; import static com.google.code.kaptcha.Constants.KAPTCHA_IMAGE_HEIGHT; import static com.google.code.kaptcha.Constants.KAPTCHA_IMAGE_WIDTH; import static com.google.code.kaptcha.Constants.KAPTCHA_NOISE_COLOR; import static com.google.code.kaptcha.Constants.KAPTCHA_NOISE_IMPL; import static com.google.code.kaptcha.Constants.KAPTCHA_OBSCURIFICATOR_IMPL; import static com.google.code.kaptcha.Constants.KAPTCHA_SESSION_CONFIG_KEY; import static com.google.code.kaptcha.Constants.KAPTCHA_TEXTPRODUCER_CHAR_LENGTH; import static com.google.code.kaptcha.Constants.KAPTCHA_TEXTPRODUCER_CHAR_SPACE; import static com.google.code.kaptcha.Constants.KAPTCHA_TEXTPRODUCER_FONT_COLOR; import static com.google.code.kaptcha.Constants.KAPTCHA_TEXTPRODUCER_FONT_NAMES; import static com.google.code.kaptcha.Constants.KAPTCHA_TEXTPRODUCER_FONT_SIZE; import static com.google.code.kaptcha.Constants.KAPTCHA_TEXTPRODUCER_IMPL; public class SimpleKaptchaProvider implements CaptchaProvider { private DefaultKaptcha textKaptcha = null; private DefaultKaptcha mathKaptcha = null; private static final String CAPTCHA_TYPE_CHAR = "char"; private static final String CAPTCHA_TYPE_MATH = "math"; public SimpleKaptchaProvider(){ this.textKaptcha = this.createTextKaptcha(); this.mathKaptcha = this.createMathKaptcha(); } /** * 可输入参数切换不同验证码方式。 * @param param math or char, 如果不输入默认为char * @return */ @Override public CaptchaResult generateCaptcha(Object param) { CaptchaResult captchaResult = null; String capStr = null, code = null; BufferedImage image = null; if(param != null){ if(param.toString().equals(CAPTCHA_TYPE_MATH)){ String capText = this.mathKaptcha.createText(); capStr = capText.substring(0, capText.lastIndexOf("@")); code = capText.substring(capText.lastIndexOf("@") + 1); image = this.mathKaptcha.createImage(capStr); captchaResult = new CaptchaResult(); captchaResult.setCode(code); captchaResult.setImage(image); return captchaResult; } } capStr = code = this.textKaptcha.createText(); image = this.textKaptcha.createImage(capStr); captchaResult = new CaptchaResult(); captchaResult.setCode(code); captchaResult.setImage(image); return captchaResult; } @Override public boolean validateCaptcha(CaptchaResult data) { return false; } @Override public CaptchaType getCaptchaType() { return CaptchaType.InputCode; } private DefaultKaptcha createTextKaptcha(){ DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); Properties properties = new Properties(); // 是否有边框 默认为true 我们可以自己设置yes,no properties.setProperty(KAPTCHA_BORDER, "yes"); // 验证码文本字符颜色 默认为Color.BLACK properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black"); // 验证码图片宽度 默认为200 properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160"); // 验证码图片高度 默认为50 properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60"); // 验证码文本字符大小 默认为40 properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "38"); // KAPTCHA_SESSION_KEY properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode"); // 验证码文本字符长度 默认为5 properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4"); // 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize) properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier"); // 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy"); Config config = new Config(properties); defaultKaptcha.setConfig(config); return defaultKaptcha; } private DefaultKaptcha createMathKaptcha(){ DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); Properties properties = new Properties(); // 是否有边框 默认为true 我们可以自己设置yes,no properties.setProperty(KAPTCHA_BORDER, "yes"); // 边框颜色 默认为Color.BLACK properties.setProperty(KAPTCHA_BORDER_COLOR, "105,179,90"); // 验证码文本字符颜色 默认为Color.BLACK properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "blue"); // 验证码图片宽度 默认为200 properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160"); // 验证码图片高度 默认为50 properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60"); // 验证码文本字符大小 默认为40 properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "35"); // KAPTCHA_SESSION_KEY properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCodeMath"); // 验证码文本生成器 properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "com.walker.support.kaptcha.KaptchaTextCreator"); // 验证码文本字符间距 默认为2 properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_SPACE, "3"); // 验证码文本字符长度 默认为5 properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "6"); // 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize) properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier"); // 验证码噪点颜色 默认为Color.BLACK properties.setProperty(KAPTCHA_NOISE_COLOR, "white"); // 干扰实现类 properties.setProperty(KAPTCHA_NOISE_IMPL, "com.google.code.kaptcha.impl.NoNoise"); // 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy"); Config config = new Config(properties); defaultKaptcha.setConfig(config); return defaultKaptcha; } }