之前实现了使用Kaptcha生成验证码图片功能,但是想将验证码改为数学运算表达式的形式,因为之前代码都实现过kaptcha生成验证码,这里只记录需要修改的项,
修改配置文件
Kaptcha其他配置不变 ,只需将Kaptcha文本实现类修改为自定义实现类即可
//一定要设成自定义实现类的全路径
properties.setProperty(Constants.KAPTCHA_TEXTPRODUCER_IMPL,
"com.xiao.blog.kaptcha.MathExpressionTextCreator");
自定义文本实现类
public class MathExpressionTextCreator extends DefaultTextCreator {
@Override
public String getText() {
//计算式的结果
int result = 0;
Random random = new Random();
int x = random.nextInt(10);
int y = random.nextInt(10);
StringBuilder text = new StringBuilder();
//随机运算符 取0 1 2 3 四个整数
int operatorRandom = (int) Math.round(Math.random() * 3);
//除法失败情况较多,失败就改为+
if (operatorRandom == 0 || operatorRandom == 1) {
if (!(y == 0) && x % y== 0) {
result = x / y;
text.append(x);
text.append("/");
text.append(y);
} else {
result = x + y;
text.append(x);
text.append("+");
text.append(y);
}
} else if (operatorRandom == 2) {
if (x >= y) {
result = x - y;
text.append(x);
text.append("-");
text.append(y);
} else {
result = y - x;
text.append(y);
text.append("-");
text.append(x);
}
} else {
result = x * y;
text.append(x);
text.append("*");
text.append(y);
}
//返回运算表达式和结果,用@符号分割
text.append("=?@" + result);
return text.toString();
}
}
修改获取验证码方法
@RequestMapping("/getVerCode")
public void defaultKaptcha(HttpServletRequest request, HttpServletResponse response) throws Exception {
byte[] captcha = null;
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
// 将生成的验证码保存在session中
String createText = defaultKaptcha.createText();
//获取运算式文本
String mathStr = createText.substring(0, createText.lastIndexOf("@"));
//获取运算式结果
String result = createText.substring(createText.lastIndexOf("@") + 1);
request.getSession().setAttribute("rightCode", result);
BufferedImage bi = defaultKaptcha.createImage(mathStr);
ImageIO.write(bi, "jpg", out);
} catch (Exception e) {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
return;
}
captcha = out.toByteArray();
response.setHeader("Cache-Control", "no-store");
response.setHeader("Pragma", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType("image/jpeg");
ServletOutputStream sout = response.getOutputStream();
sout.write(captcha);
sout.flush();
sout.close();
}