<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;
}
}