参考:Kaptchar DefaultKaptcha 配置_xx先森-CSDN博客
1.配置config交给spring管理
import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.util.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Properties;
@Configuration
public class KaptchaConfig {
@Bean
public DefaultKaptcha producer() {
Properties properties = new Properties();
// 图片边框
properties.put("kaptcha.border", "yes");
//边框颜色
properties.put("kaptcha.border.color", "blue");
//背景颜色渐变开始
properties.put("kaptcha.background.clear.from", "47,58,255");
//背景颜色渐变结束
properties.put("kaptcha.background.clear.to", "249,207,204");
// 字体颜色
properties.put("kaptcha.textproducer.font.color", "black");
// 文字间隔
properties.put("kaptcha.textproducer.char.space", "5");
// 字体
properties.put("kaptcha.textproducer.font.names", "Arial,Courier,cmr10,宋体,楷体,微软雅黑");
Config config = new Config(properties);
DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
defaultKaptcha.setConfig(config);
return defaultKaptcha;
}
}
2.使用
public ResultVO<String> captcha(HttpServletRequest request){
KaptchaConfig bean = SpringUtils.getBean(KaptchaConfig.class);
String remoteAddr = request.getRemoteAddr();
DefaultKaptcha producer = bean.producer();
//加载配置
String validate = producer.createText();
//将生成的验证码放入redis
redisUtil.set(Const.IMG_CODE + remoteAddr, validate, 60 * 3);
//生成缓存区图片(这里会有异常提示有几个包没有需要去导包,具体的用try...cath打出来查看)
BufferedImage img = producer.createImage(validate);
ByteArrayOutputStream baos = new ByteArrayOutputStream();//io流
try {
ImageIO.write(img, "jpg", baos);//写入流中
} catch (IOException e) {
e.printStackTrace();
}
byte[] bytes = baos.toByteArray();//转换成字节
// BASE64Encoder encoder = new BASE64Encoder();
// String jpg_base64 = encoder.encodeBuffer(bytes).trim();//转换成base64串
String jpg_base64 = Base64Utils.encodeToString(bytes).trim();//转换成base64串
jpg_base64 = jpg_base64.replaceAll("\n", "").replaceAll("\r", "");//删除 \r\n
return new ResultVO<>(ResultStatus.SUCCESS, "data:image/jpg;base64," + jpg_base64);
}
这里是生成base64图片返回给前端,也可以直接将流写入response中
//获取生成的随机数存入session,以便之后比较
String validate = producer.createText();
req.getSession().setAttribute("validate",validate);
//生成缓存区图片(这里会有异常提示有几个包没有需要去导包,具体的用try...cath打出来查看)
BufferedImage img = producer.createImage(validate);
//设置服务器发送给浏览器的数据类型,这里浏览器会以图片的形式解析HTML
resp.setContentType("image/jpeg");
//用于输出字符流数据或者二进制的字节流数据
OutputStream ops = resp.getOutputStream();
//将缓存区图片数据写入
ImageIO.write(img,"jpg",ops);
ops.close();