如何在项目中实现登录时的验证码校验功能?
 
 - 第一步:创建项目,添加依赖
- 第二步:验证码配置(CaptchaConfig类)
- 第三步:创建CaptchaController
- 第四步:测试
- 注意问题
  
 
- 这里介绍一款老牌的验证码工具kaptcha
- github链接: https://github.com/penggle/kaptcha
- 下面用一个简单的例子讲解一下使用步骤:
第一步:创建项目,添加依赖
 

 
<dependency>
  <groupId>com.github.penggle</groupId>
  <artifactId>kaptcha</artifactId>
  <version>2.3.2</version>
</dependency>
 
第二步:验证码配置(CaptchaConfig类)
 
- 提供了两个Bean,一个是字符串匹配验证码,一个是数学计算验证码,这里以字符串方式演示:
import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.util.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Properties;
import static com.google.code.kaptcha.Constants.*;
@Configuration
public class CaptchaConfig {
    
    @Bean(name = "captchaProducer")
    public DefaultKaptcha getKaptchaBean() {
        DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
        Properties properties = new Properties();
        
        properties.setProperty(KAPTCHA_BORDER, "yes");
        
        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black");
        
        properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160");
        
        properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60");
        
        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "38");
        
        properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode");
        
        properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4");
        
        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier");
        
        properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy");
        Config config = new Config(properties);
        defaultKaptcha.setConfig(config);
        return defaultKaptcha;
    }
    
}
 
第三步:创建CaptchaController
 
@RestController
public class CaptchaController {
    @Autowired
    DefaultKaptcha defaultKaptcha;
    @GetMapping("/textCaptcha")
    public void textCaptcha(HttpServletResponse resp) throws IOException {
        
        String text = defaultKaptcha.createText();
        
        BufferedImage image = defaultKaptcha.createImage(text);
        
        ImageIO.write(image,"jpg",resp.getOutputStream());
    }
	@GetMapping("/hello")
    public void hello(HttpSession session){
        System.out.println("session.getAttribute.kaptchaCode : " + session.getAttribute("kaptchaCode"));
    }
}
 
第四步:测试
 
- 访问:http://localhost:8086/textCaptcha,获得验证码
  
注意问题
 
 
properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode");
 
- 意思是自动将验证码文本存入 session 中
- 但是我们测试接口:http://localhost:8086/hello,发现 session 是空的
  
- 因为他自己其实是提供有一个 Servlet ,我们自己写 controller 这个配置是不生效的,想要它生效,配置文件就不能上边那样写了
@Bean
    ServletRegistrationBean<HttpServlet> captchaServlet(){
        ServletRegistrationBean<HttpServlet> bean = new ServletRegistrationBean<>();
        bean.setServlet(new KaptchaServlet());
        bean.addUrlMappings("/test2");
        Properties properties = new Properties();
        
        properties.setProperty(KAPTCHA_BORDER, "yes");
        
        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black");
        
        properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160");
        
        properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60");
        
        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "38");
        
        properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode");
        
        properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4");
        
        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier");
        
        properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy");
        bean.setInitParameters(new HashMap<>((Map)properties));
        return bean;
    }
 
- 配置文件改成这样,就可以用了(注意注释掉自己controller的测试接口)
 源码链接