用导包法生成计算验证码

用导包法生成计算验证码

最近学习中发现了导包法生成验证码,它不是多新奇,只是有一点,使用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()函数,用于计算字符串的函数。可以留意,以便以后遇到可以使用。

发布了67 篇原创文章 · 获赞 12 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/m0_37635053/article/details/105365313