后台使用Captcha生成验证码
使用Redis存储sessionId绑定客户端验证码

1、生成验证码后,在redis中sessionId作为验证码Key
   @GetMapping(value = {"","/"})
   public void getKaptchaImage(HttpServletRequest request, HttpServletResponse response) throws IOException {
       HttpSession session = request.getSession();
       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");
       response.setContentType("image/jpeg");
       String capText = captchaProducer.createText();
       //session.setAttribute(Constants.KAPTCHA_SESSION_KEY, capText); 此处与session过期冲突
       //单独实现验证码60s过期功能
       stringRedisTemplate.opsForValue().set(“mar:captcha:”+session.getId(),capText,60, TimeUnit.SECONDS);
       BufferedImage bi = captchaProducer.createImage(capText);
       ServletOutputStream out = null;
       try {
           out = response.getOutputStream();
           ImageIO.write(bi, "JPEG", out);
           out.flush();
       } catch (IOException e) {
           log.error("获取验证码图片异常:", e);
       } finally {
           if (null != out) {
               out.close();
           }
       }

   }

Redis中数据如下

在这里插入图片描述

2、过期时响应

String sessionYzm = stringRedisTemplate.opsForValue().get(mar:captcha:" + request.getSession().getId());
if (sessionYzm==null){
	//返回给前端
    return "验证码已过期,请重新输入!";
}
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐