一、准备工作:
作者采用导入第三方插件的方式进行生成和二维码的校验,首先导入第三方的依赖
<dependency>
<groupId>com.github.penggle</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
</dependency>
二、生成二维码
@Configuration
public class VerifyProducer {
@Bean
Producer producer(){
Properties properties = new Properties();
DefaultKaptcha kaptcha = new DefaultKaptcha();
properties.setProperty("kaptcha.image.width","150");
properties.setProperty("kaptcha.image.height","50");
properties.setProperty("kaptcha.textproducer.char.string","0123456789");
properties.setProperty("kaptcha.textproducer.char.length","4");
kaptcha.setConfig(new Config(properties));
return kaptcha;
}
}
三、提供获取二维码的接口
@GetMapping("/verify")
public void getVerify(HttpSession session, HttpServletResponse resp){
resp.setContentType("image/jpeg");
String text = producer.createText();
BufferedImage image = producer.createImage(text);
try {
ServletOutputStream out = resp.getOutputStream();
ImageIO.write(image,"jpg",out);
session.setAttribute("verify",text);
} catch (IOException e) {
e.printStackTrace();
}
}
四、对登录时二维码进行校验
//只有登录时才对验证码校验
if ("POST".equals(req.getMethod())&& "/doLogin".equals(req.getServletPath())){
String code = req.getParameter("code");
String verify=(String) req.getSession().getAttribute("verify");
if (code==null || "".equals(code) || !verify.toLowerCase().equals(code.toLowerCase())){
resp.setContentType("application/json;charset=utf-8");
PrintWriter out = resp.getWriter();
out.write(JSONObject.toJSONString(RespBean.error("验证码不正确")));
out.flush();
out.close();
}
五、效果展示
1、获取二维码
2、校验二维码 二维码不正确
二维码正确