ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java中的验证码的理解之springboot与kaptch的整合

2019-07-14 09:00:20  阅读:594  来源: 互联网

标签:kaptch java springboot kaptcha 验证码 httpServletResponse code setProperty properti


一、背景

1.因为最近项目中要更换验证码,用的是kaptch与springboot,操作起来也是比较方便的,也趟了不少弯路,特意记下这个方法,以供大家学习参考,下面我们就来讲解下。

二、项目结构

三、详细的配置

1.pom.xml

<!-- kaptcha  -->
<dependency>
	<groupId>com.google.code</groupId>
	<artifactId>kaptcha</artifactId>
	<version>2.3.2</version>
</dependency>

2.config

2.1.KaptchaConfig.java

@Component
public class KaptchaConfig {
    @Bean
    public DefaultKaptcha getDefaultKaptcha(){
        DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
        Properties properties = new Properties();
        properties.setProperty("kaptcha.border", "no");
        properties.setProperty("kaptcha.border.color", "blue");
        properties.setProperty("kaptcha.textproducer.font.color", "black");
        properties.setProperty("kaptcha.image.width", "160");
        properties.setProperty("kaptcha.image.height", "50");
        properties.setProperty("kaptcha.textproducer.font.size", "40");
        properties.setProperty("kaptcha.session.key", "code");
        properties.setProperty("kaptcha.noise.color", "white");
        properties.setProperty("kaptcha.obscurificator.impl", "com.google.code.kaptcha.impl.ShadowGimpy");
        properties.setProperty("kaptcha.textproducer.char.length", "4");
        properties.setProperty("kaptcha.textproducer.font.names", "宋体,楷体,微软雅黑");
        Config config = new Config(properties);
        defaultKaptcha.setConfig(config);
        return defaultKaptcha;
    }
}

3.controller

3.1.生成验证码的接口(CreateCode.java)

@Controller
@RequestMapping(value = "/createCode")
public class CreateCode {

    @Autowired
    DefaultKaptcha defaultKaptcha;

    @RequestMapping(value="/testdemo", method= RequestMethod.GET)
    public void createCode(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception{
        byte[] captchaChallengeAsJpeg = null;
        ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();
        try {
            //生产验证码字符串并保存到session中去
            String createText = defaultKaptcha.createText();
            //给定一个唯一标识,防止验证码重复使用
            httpServletRequest.getSession().setAttribute(Constants.KAPTCHA_SESSION_KEY, createText);
            //redisCache.set(RedisCache.prefix, coldFlag, createText);
            //使用生产的验证码字符串返回一个BufferedImage对象并转为byte写入到byte数组中
            BufferedImage challenge = defaultKaptcha.createImage(createText);
            ImageIO.write(challenge, "jpg", jpegOutputStream);
        } catch (IllegalArgumentException e) {
            httpServletResponse.sendError(HttpServletResponse.SC_NOT_FOUND);
            return;
        }
        //定义response输出类型为image/jpeg类型,使用response输出流输出图片的byte数组
        captchaChallengeAsJpeg = jpegOutputStream.toByteArray();
        httpServletResponse.setHeader("Cache-Control", "no-store");
        httpServletResponse.setHeader("Pragma", "no-cache");
        httpServletResponse.setDateHeader("Expires", 0);
        httpServletResponse.setContentType("image/jpeg");
        ServletOutputStream responseOutputStream = httpServletResponse.getOutputStream();
        responseOutputStream.write(captchaChallengeAsJpeg);
        responseOutputStream.flush();
        responseOutputStream.close();
    }
}

3.2.postman测试生成验证码

3.3.模拟前端校验验证码(PreCheckController)

@Controller
@RequestMapping(value = "/preCheckCode")
@Slf4j
public class PreCheckController {
    //验证码验证
    @PostMapping("/checkCode")
    @ResponseBody
    public String imgvrifyControllerDefaultKaptcha(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,@RequestBody JSONObject data){
        String captchaId = (String) httpServletRequest.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY);
        String code = data.getString("code");
        log.info("Session  vrifyCode ---->"+captchaId+"---- form code --->"+code);
        if (!captchaId.equals(code)) {
            log.info("错误的验证码");
            return "fail";
        } else {
            return "success";
        }
    }
}

3.4.模拟前端postman测试

四、看后端日志

1.日志,前端输入的和我们保存在session中的是一致的

五、总结

1.这样就完成了验证码的生成以及校验,希望能帮助到你们,共勉!!!

标签:kaptch,java,springboot,kaptcha,验证码,httpServletResponse,code,setProperty,properti
来源: https://blog.csdn.net/chenmingxu438521/article/details/95852380

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有