jcaptcha验证码

253 阅读1分钟

jcaptcha验证码

导入依赖

        <dependency>
            <groupId>com.octo.captcha</groupId>
            <artifactId>jcaptcha</artifactId>
            <version>1.0</version>
        </dependency>

工具包

JCaptchaUtil的工具包,新建util,新建JCaptchaUtil类,生成验证码

public class JCaptchaUtil {

    private static final ImageCaptchaService SERVICE =imageCaptchaService();

    public static ImageCaptchaService getService(){
        return SERVICE;
    }

    private static ImageCaptchaService imageCaptchaService(){

        //背景
        UniColorBackgroundGenerator backgroundGenerator =new UniColorBackgroundGenerator(100,50);

        //字
        //给字随机生成一种颜色,三原色的范围是三个数组
        RandomRangeColorGenerator textColor = new RandomRangeColorGenerator(new int[]{0,100},new int[]{100,200},new int[]{150,250});
        //随机生成字的个数 4个或者五个,字的颜色为 textColor
        RandomTextPaster randomTextPaster =new RandomTextPaster(4,4,textColor);

        //字的大小 字体
        RandomFontGenerator randomFontGenerator = new RandomFontGenerator(20,30);

        //组装图像 字体+背景+字
        ComposedWordToImage composedWordToImage=new ComposedWordToImage(randomFontGenerator,backgroundGenerator,randomTextPaster);
        //设置字的形状为toddlist
        ComposeDictionaryWordGenerator cdwg =new ComposeDictionaryWordGenerator(new FileDictionary("toddlist"));
        //组装
        GimpyFactory gf =new GimpyFactory(cdwg,composedWordToImage);

        //生成一个GenericCaptchaEngine引擎
        GenericCaptchaEngine gce =new GenericCaptchaEngine(new CaptchaFactory[]{gf});
        //有效时间为20,最大的存储大小为2000,
        return new GenericManageableCaptchaService(gce,20,2000,2000);
    }
}

控制层

利用session的唯一性来保证验证码的每次请求得到刷新,调用JCaptchaUtil类

    @GetMapping("/generator")
    @TokenCheck(required = false)
    public void generatorJcaptcha(HttpServletRequest request, HttpServletResponse response){

        try {
            //获取每次请求的session id 用来保证每次请求验证码的唯一性
            String id = request.getSession().getId();
            BufferedImage bufferedImage = JCaptchaUtil.getService().getImageChallengeForID(id);

            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(byteArrayOutputStream);

            jpegEncoder.encode(bufferedImage);

            response.setHeader("Cache-Control","no-store");
            response.setContentType("image/jpeg");

            byte[] bytes = byteArrayOutputStream.toByteArray();
            ServletOutputStream servletOutputStream = response.getOutputStream();

            servletOutputStream.write(bytes);
            servletOutputStream.flush();
            servletOutputStream.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

生成验证码

校验

由于validateResponseForID中存有验证码的值调用JCaptchaUtil.getService().validateResponseForID(sessionID,验证码)验证即可

   //校验验证码
    @GetMapping("/verify")
    @TokenCheck(required = false)
    public String verify(String verifyCode, HttpServletRequest request){

        System.out.println("校验验证码");
        Boolean aBoolean = JCaptchaUtil.getService().validateResponseForID(request.getSession().getId(), verifyCode);
        if (aBoolean){
            return "验证码校验通过";
        }
        return "验证码校验失败";
    }

校验通过

校验失败

报错记录

导入依赖spring boot启动问题

依赖错误

将pom文件依赖改成,即可正常运行

      <dependency>
            <groupId>com.octo.captcha</groupId>
            <artifactId>jcaptcha</artifactId>
            <version>1.0</version>
            <exclusions>
                <exclusion>
                    <artifactId>servlet-api</artifactId>
                    <groupId>javax.servlet</groupId>
                </exclusion>
            </exclusions>
        </dependency>