图片验证码详解(生成/保存/发送/验证)


本文使用的图片验证码生产工具是captcha,废话不多说,直接上代码

关于前后端分离,图片如何保存验证,只需前端获取图片验证码时传入一个key,将图片存入redis时用该key作为存入redis的key,提交注册/登录时携带该key,即可。

 

Controller

/**
 * 图片验证码 控制器
 */
@RestController
@Api(value = "@-图片验证码")
@RequestMapping(value = "/admin/imagevc/")
public class ImageVcController extends ZyBaseController {

    @Autowired
    protected CaptchaService captchaService;

    /**
     * 获取图片验证码
     *
     * @return java.lang.Object
     * @author xx
     * @date 2021/3/03 10:36
     */
    @PostMapping(value = "")
    public void query(@RequestBody ImageVcIn in ,HttpServletResponse response) {
        captchaService.create(in,response);
    }
}
View Code

Service

@Slf4j @Service public class CaptchaService { @Autowired private RedisService redisService; /** * @Description: 获取图片验证码 * @param response: * @return: void * @author: xx * @date: 2021/3/3 4:54 下午 */
    public void create(ImageVcIn in, HttpServletResponse response) { try { ValidateCodeProperties validateCodeProperties = new ValidateCodeProperties(); setHeader(response, validateCodeProperties.getType()); Captcha captcha = createCaptcha(); redisService.set("tpyzm-"+in.getImageVcKey(), StringUtils.lowerCase(captcha.text()), validateCodeProperties.getTime()); captcha.out(response.getOutputStream()); }catch (IOException e){ log.error("获取图片验证码失败",e); } } /** * @Description: 校验图片验证码是否正确 * @param key: * @param value: * @return: void * @author: xx * @date: 2021/3/3 4:53 下午 */
    public void check(String key, String value){ Object codeInRedis = redisService.get("tpyzm-"+key); Optional.ofNullable(codeInRedis).orElseThrow(()->new BusinessException("验证码已过期")); if (!StringUtils.equalsIgnoreCase(value, String.valueOf(codeInRedis))) { throw new BusinessException("验证码不正确"); } } /** * @Description: 创建图片验证码 * @param : * @return: com.wf.captcha.base.Captcha * @author: xx * @date: 2021/3/3 9:30 上午 */
    public Captcha createCaptcha() { ValidateCodeProperties validateCodeProperties = new ValidateCodeProperties(); Captcha captcha = null; if (StringUtils.equalsIgnoreCase(validateCodeProperties.getType(), ImageType.GIF)) { captcha = new GifCaptcha(validateCodeProperties.getWidth(), validateCodeProperties.getHeight(), validateCodeProperties.getLength()); } else { captcha = new SpecCaptcha(validateCodeProperties.getWidth(), validateCodeProperties.getHeight(), validateCodeProperties.getLength()); } captcha.setCharType(validateCodeProperties.getCharType()); return captcha; } /** * @Description: 设置返回头信息 * @param response: * @param type: * @return: void * @author: xx * @date: 2021/3/3 9:30 上午 */
    private void setHeader(HttpServletResponse response, String type) { if (StringUtils.equalsIgnoreCase(type, ImageType.GIF)) { response.setContentType(MediaType.IMAGE_GIF_VALUE); } else { response.setContentType(MediaType.IMAGE_PNG_VALUE); } response.setHeader(HttpHeaders.PRAGMA, "No-cache"); response.setHeader(HttpHeaders.CACHE_CONTROL, "No-cache"); response.setDateHeader(HttpHeaders.EXPIRES, 0L); } }
View Code

pom

       <!--图片验证码-->
        <dependency>
            <groupId>com.github.whvcse</groupId>
            <artifactId>easy-captcha</artifactId>
            <version>1.6.2</version>
        </dependency> 

 

效果展示:

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM