用导包法生成计算验证码
最近学习中发现了导包法生成验证码,它不是多新奇,只是有一点,使用javascript计算字符串的方法需留意,挺管用。
第一步:导包
<!--kaptcha-->
<dependency>
<groupId>com.github.penggle</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
</dependency>
第二步:控制层向外输出图片
@GetMapping(value = "/verifyCode")
@ResponseBody
public void verifyCode(HttpServletResponse response, User user, @RequestParam("goodsId") long goodsId) {
BufferedImage image = miaoshaOrderService.createVerifyCode(user, goodsId);
try {
OutputStream out = response.getOutputStream();
ImageIO.write(image, "jpg", out);
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
第三步:在service层生成验证码
// 生成验证码图片
public BufferedImage createVerifyCode(User user, Long goodsId) {
DefaultKaptcha defaultKaptcha = kaptchaConfig.getDefaultKaptcha();
String text = generateText();
redisService.set(MiaoshaOrderPrefix.verifyCode, "" + user.getId() + goodsId, eval(text));
return defaultKaptcha.createImage(text);
}
// 生成验证码文本
public String generateText() {
char opt[] = new char[]{'+', '-', '*'};
Random random = new Random();
int num1 = random.nextInt(9) + 1;
int num2 = random.nextInt(9) + 1;
int num3 = random.nextInt(9) + 1;
char opt1 = opt[random.nextInt(3)];
char opt2 = opt[random.nextInt(3)];
return "" + num1 + opt1 + num2 + opt2 + num3;
}
public Integer eval(String expression) {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
try {
return (Integer) engine.eval(expression);
} catch (ScriptException e) {
e.printStackTrace();
return null;
}
}
第四步:验证码配置类
@Configuration
public class KaptchaConfig {
@Bean
public DefaultKaptcha getDefaultKaptcha() {
DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
Properties properties = new Properties();
properties.setProperty("kaptcha.border", "no");
properties.setProperty("kaptcha.textproducer.char.length", "4");
properties.setProperty("kaptcha.session.key", "code");
//字体颜色
properties.setProperty("kaptcha.textproducer.font.color", "red");
//干扰线
properties.setProperty("kaptcha.noise.impl", "com.google.code.kaptcha.impl.DefaultNoise");
//干扰线颜色
properties.setProperty("kaptcha.noise.color", "red");
properties.setProperty("kaptcha.textproducer.char.space", "4");
Config config = new Config(properties);
defaultKaptcha.setConfig(config);
return defaultKaptcha;
}
}
这里需要注意的是:内嵌了脚本支持。即这里的eval()函数,用于计算字符串的函数。可以留意,以便以后遇到可以使用。