如何在项目中实现登录时的验证码校验功能?
- 第一步:创建项目,添加依赖
- 第二步:验证码配置(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.*;@Configurationpublic 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
@RestControllerpublic class CaptchaController {@AutowiredDefaultKaptcha 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 这个配置是不生效的,想要它生效,配置文件就不能上边那样写了
@BeanServletRegistrationBean<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的测试接口)
源码链接