Google-kaptcha验证码使用步骤(基于springboot/使用redis存储)

6,691 阅读3分钟

上代码

        <!--图片验证码-->
        <dependency>
            <groupId>com.github.penggle</groupId>
            <artifactId>kaptcha</artifactId>
            <version>2.3.2</version>
        </dependency>
验证码配置类
/**
 * 验证码配置类
 *
 * @author zhanghao
 * @date 2019/7/16 14:40
 */
@Configuration
public class KaptchaController {
    @Bean(name="captchaProducer")
    public DefaultKaptcha getKaptchaBean(){
        DefaultKaptcha defaultKaptcha=new DefaultKaptcha();
        Properties properties=new Properties();
        //验证码是否带边框 No
        properties.setProperty("kaptcha.border", "no");
        //验证码字体颜色
        properties.setProperty("kaptcha.textproducer.font.color", "blue");
        //验证码整体宽度
        properties.setProperty("kaptcha.image.width", "400");
        //验证码整体高度
        properties.setProperty("kaptcha.image.height", "125");
        //文字个数
        properties.setProperty("kaptcha.textproducer.char.length", "4");
        //文字大小
        properties.setProperty("kaptcha.textproducer.font.size","120");
        //文字随机字体
        properties.setProperty("kaptcha.textproducer.font.names", "宋体,楷体,微软雅黑");
        //文字距离
        properties.setProperty("kaptcha.textproducer.char.space","16");
        //干扰线颜色
        properties.setProperty("kaptcha.noise.color","blue");
        //自定义验证码样式
        properties.setProperty("kaptcha.obscurificator.impl","com.zhiyingwl.modules.imageCode.base.DisKaptchaCssImpl");
        //自定义验证码背景
        properties.setProperty("kaptcha.background.impl","com.zhiyingwl.modules.imageCode.base.NoKaptchaBackhround");
        Config config=new Config(properties);
        defaultKaptcha.setConfig(config);
        return defaultKaptcha;
    }
}

感觉背景不好看 想要干净一点的

/**
 * 去除验证码背景实现类
 *
 * @author zhanghao
 * @date 2019/7/16 15:52
 */
public class NoKaptchaBackhround  extends Configurable implements BackgroundProducer {

    public NoKaptchaBackhround(){
    }
    @Override
    public BufferedImage addBackground(BufferedImage baseImage) {
        int width = 400;
        int height = 125;
        BufferedImage imageWithBackground = new BufferedImage(width, height, 1);
        Graphics2D graph = (Graphics2D)imageWithBackground.getGraphics();
        graph.fill(new Rectangle2D.Double(0.0D, 0.0D, (double)width, (double)height));
        graph.drawImage(baseImage, 0, 0, null);
        return imageWithBackground;
    }
}

官方提供的三种样式也去掉

/**
 * 自定义样式实现类
 *
 * @author zhanghao
 * @date 2019/7/16 16:41
 */
public class DisKaptchaCssImpl extends Configurable implements GimpyEngine {

    public  DisKaptchaCssImpl(){

    }
    @Override
    public BufferedImage getDistortedImage(BufferedImage baseImage) {
        NoiseProducer noiseProducer = this.getConfig().getNoiseImpl();
        BufferedImage distortedImage = new BufferedImage(400, 125, 2);
        Graphics2D graph = (Graphics2D)distortedImage.getGraphics();
        Random rand = new Random();
        RippleFilter rippleFilter = new RippleFilter();
        rippleFilter.setXAmplitude(7.6F);
        rippleFilter.setYAmplitude(rand.nextFloat() + 1.0F);
        rippleFilter.setEdgeAction(1);
        BufferedImage effectImage = rippleFilter.filter(baseImage, (BufferedImage)null);
        graph.drawImage(effectImage, 0, 0, (Color)null, (ImageObserver)null);
        graph.dispose();
        noiseProducer.makeNoise(distortedImage, 0.1F, 0.1F, 0.25F, 0.25F);
        noiseProducer.makeNoise(distortedImage, 0.1F, 0.25F, 0.5F, 0.9F);
        return distortedImage;
    }
}

验证码生成和校验

/**
 * 验证码控制层
 *
 * @author zhanghao
 * @date 2019/7/16 17:35
 */
@RestController
@RequestMapping("/image_code")
public class ImageCodeController  extends BaseController {
    @Autowired
    private Producer captchaProducer;

    @Autowired
    private RedisService redisService;
    /**
     * 生成验证码
     *
     * @param response
     * @return void
     * @author zhanghao
     * @date 2019/7/17 2019/7/17
     */
    @GetMapping("/pb/code")
    public void getImageCode(HttpServletResponse response,@RequestParam("uuid") String uuid) throws Exception {

        //禁止缓存
        response.setDateHeader("Expires", 0);
        response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
        response.addHeader("Cache-Control", "post-check=0, pre-check=0");
        response.setHeader("Pragma", "no-cache");
        //设置响应格式为png图片
        response.setContentType("image/png");

        //为验证码创建一个文本
        String codeText = captchaProducer.createText();
        //将验证码存到redis
        redisService.set(ImageCodeKeyName.ZYWL_IMAGE_CODE+uuid,codeText);
        // 用创建的验证码文本生成图片
        BufferedImage bi = captchaProducer.createImage(codeText);
        ServletOutputStream out = response.getOutputStream();
        //写出图片
        ImageIO.write(bi, "png", out);
        try {
            out.flush();
        } finally {
            out.close();
        }
    }

    /**
     * 图片验证码校验
     *
     * @param validImageCode
     * @return com.zhiyingwl.base.entity.ResultEntity
     * @author zhanghao
     * @date 2019/7/17 2019/7/17
     */
    @GetMapping("/pv/check")
    public ResultEntity checkImageCode(
            @RequestParam(value = "image_code") String validImageCode,
            @RequestParam("uuid")String uuid){
        try {
            if (StrUtil.isBlank(validImageCode)){
                return resultInfo(false,"验证码不能为空");
            }
            String imageCode = redisService.get(ImageCodeKeyName.ZYWL_IMAGE_CODE + uuid);
            if (!imageCode.equals(validImageCode)){
                return resultInfo(false,"验证码错误");
            }
            return resultInfo(true,"验证通过");
        } catch (Exception e) {
            return resultInfo(false,e.getMessage());
        }
    }


}

效果 官方的

自定义的

提醒:

  • 前端调用生成验证码要在src里请求

  • 使用seesion存储要解决跨域的问题

附上官方配置表

* Constant	描述	默认值
kaptcha.border	图片边框,合法值:yes , no	yes
kaptcha.border.color	边框颜色,合法值: r,g,b (and optional alpha) 或者 white,black,blue.	black
kaptcha.border.thickness	边框厚度,合法值:>0	1
kaptcha.image.width	图片宽	200
kaptcha.image.height	图片高	50
kaptcha.producer.impl	图片实现类	com.google.code.kaptcha.impl.DefaultKaptcha
kaptcha.textproducer.impl	文本实现类	com.google.code.kaptcha.text.impl.DefaultTextCreator
kaptcha.textproducer.char.string	文本集合,验证码值从此集合中获取	abcde2345678gfynmnpwx
kaptcha.textproducer.char.length	验证码长度	5
kaptcha.textproducer.font.names	字体	Arial, Courier
kaptcha.textproducer.font.size	字体大小	40px.
kaptcha.textproducer.font.color	字体颜色,合法值: r,g,b  或者 white,black,blue.	black
kaptcha.textproducer.char.space	文字间隔	2
kaptcha.noise.impl	干扰实现类	com.google.code.kaptcha.impl.DefaultNoise
kaptcha.noise.color	干扰颜色,合法值: r,g,b 或者 white,black,blue.	black
kaptcha.obscurificator.impl	图片样式:
水纹com.google.code.kaptcha.impl.WaterRipple
鱼眼com.google.code.kaptcha.impl.FishEyeGimpy
阴影com.google.code.kaptcha.impl.ShadowGimpy	com.google.code.kaptcha.impl.WaterRipple
kaptcha.background.impl	背景实现类	com.google.code.kaptcha.impl.DefaultBackground
kaptcha.background.clear.from	背景颜色渐变,开始颜色	light grey
kaptcha.background.clear.to	背景颜色渐变,结束颜色	white
kaptcha.word.impl	文字渲染器	com.google.code.kaptcha.text.impl.DefaultWordRenderer
kaptcha.session.key	session key	KAPTCHA_SESSION_KEY
kaptcha.session.date	session date	KAPTCHA_SESSION_DATE