如何在项目中实现登录时的验证码校验功能?
- 第一步:创建项目,添加依赖
- 第二步:验证码配置(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的测试接口)
源码链接