EasyCaptcha的使用jdk17(解决:javax. script ScriptEngine.eval(String)“ because “engine“ is nul)

   <dependency>
            <groupId>com.github.whvcse</groupId>
            <artifactId>easy-captcha</artifactId>
            <version>1.6.2</version>
        </dependency>
        <dependency>
            <groupId>org.openjdk.nashorn</groupId>
            <artifactId>nashorn-core</artifactId>
            <version>15.4</version>
        </dependency>

由于jdk9以后,就将 内置JavaScript去掉了,所以得自己导入这个org.openjdk.nashorn,就不会报错了(使用算数验证码的时候)。

调用这个api,会给你制造一个图片,可以直接传回前端,也可以用base64让前端解析显示

base64:

package com.example.springboot17.controller;

import com.wf.captcha.*;
import com.wf.captcha.base.Captcha;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.awt.*;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * @desccription 测试EasyCaptcha内存泄露
 * @auth wangshaopeng@talkweb.com.cn
 * @date 2022/9/9
 */
@RestController
@RequestMapping("test")
public class TestController {
    Logger log = LoggerFactory.getLogger(TestController.class);
    Font font;

    {
        try {
            font = Font.createFont(0, this.getClass().getResourceAsStream("/actionj.ttf")).deriveFont(1, 32.0F);
        } catch (FontFormatException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 每次创建验证码时,都重新加载字体文件,会导致OOM
     *
     * @param p
     * @return
     */
    @GetMapping("/c1")
    public Map<String, String> captcha1(String p) {
        SpecCaptcha specCaptcha = new SpecCaptcha(130, 48, 5);
        String verCode = specCaptcha.text().toLowerCase();
        log.info("c1 captcha verCode:{}, p:{}", verCode, p);
        // 将key和base64返回给前端
        Map<String, String> map = new HashMap<>(2);
        map.put("verCode", verCode);
        map.put("image", specCaptcha.toBase64());
        return map;
    }

    /**
     * 使用全局字体对象,只加载一次字体文件,避免OOM
     *
     * @param p
     * @return
     */
    @GetMapping("/c2")
    public Map<String, String> captcha2(String p) {
        SpecCaptcha specCaptcha = new SpecCaptcha(130, 48, 5);
        specCaptcha.setFont(font);
        String verCode = specCaptcha.text().toLowerCase();
        log.info("c2 captcha verCode:{}, p:{}", verCode, p);
        // 将key和base64返回给前端
        Map<String, String> map = new HashMap<>(2);
        map.put("verCode", verCode);
        map.put("image", specCaptcha.toBase64());
        return map;
    }

    @GetMapping("/c3")
    public Map<String, String> captcha3(String p) {
        Captcha captcha = getCaptcha(5, 100, 100, 2);
        captcha.setFont(font);
        Map<String, String> map = new HashMap<>(2);
        map.put("verCode", captcha.text());
        map.put("image", captcha.toBase64());
        return map;
    }
//传回图片
    @GetMapping("/c4")
    public void captcha4(HttpServletResponse response) throws IOException {
        Captcha captcha = getCaptcha(5, 100, 100, 2);
        captcha.setFont(font);
        try {
            captcha.out(response.getOutputStream());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        response.flushBuffer();
    }

    /**
     * @param p      选择需要的验证码图片
     * @param width
     * @param height
     * @param length
     * @return
     */
    public Captcha getCaptcha(int p, int width, int height, int length) {
        Captcha captcha;
        switch (p) {
            case 1:
                // 算术类型,固定设置为两位,图片为算数运算表达式
                captcha = new ArithmeticCaptcha(width, height, 2);
                break;
            case 2:
                //中文
                captcha = new ChineseCaptcha(width, height);
                captcha.setLen(length);
                break;
            case 3:
                //中文gif(有点问题,不能使用)
                captcha = new ChineseGifCaptcha(width, height);
                captcha.setLen(length);
                break;
            case 4:
                //gif英文
                captcha = new GifCaptcha(width, height);
                captcha.setLen(length);
                break;
            case 5:
                captcha = new SpecCaptcha(width, height);
                captcha.setLen(length);
                break;
            default:
                throw new RuntimeException("验证码配置信息错误!");
        }
        //字体,需要配置
        captcha.setFont(font);
        return captcha;
    }
}

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值