基于前后端分离或者非前后端分离都可以使用的java验证码实现方法
第一步:引入依赖
<dependency>
<groupId>com.github.penggle</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
</dependency>
第二步:增加验证码生成的配置类,颜色,字体,干扰线等配置都在这里修改
参数参考地址:https://www.cnblogs.com/louis80/p/5230507.html
package com.aa.fs.config;
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;
/**
* @author: songgt
* @date: 2018-07-11 8:52
*/
@Configuration
public class KaptchaConfig {
@Bean(name="captchaProducer")
public DefaultKaptcha getKaptchaBean(){
DefaultKaptcha defaultKaptcha=new DefaultKaptcha();
Properties properties=new Properties();
properties.setProperty("kaptcha.border", "no");
properties.setProperty("kaptcha.border.color", "white");
properties.setProperty("kaptcha.textproducer.font.color", "255,192,55");
properties.setProperty("kaptcha.image.width", "125");
properties.setProperty("kaptcha.image.height", "45");
properties.setProperty("kaptcha.session.key", "code");
properties.setProperty("kaptcha.textproducer.font.size", "38");
properties.setProperty("kaptcha.noise.color","21,113,171");
properties.setProperty("kaptcha.background.clear.from","0,154,255");
properties.setProperty("kaptcha.background.clear.to","0,202,255");
properties.setProperty("kaptcha.textproducer.char.length", "4");
properties.setProperty("kaptcha.textproducer.font.names", "Arial");
Config config=new Config(properties);
defaultKaptcha.setConfig(config);
return defaultKaptcha;
}
}
第三步:Service实现层
//记得在Service层需要注入
@Autowired
private DefaultKaptcha defaultKaptcha;
// ----------------------------------------------------------------------
@Override
public String createPicVerificationCode(String param,HttpServletRequest request) {
if (StringUtils.isNotBlank(param)){
byte[] captchaChallengeAsJpeg;
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
try {
String verificationCodeText = defaultKaptcha.createText();
//加入到session方便后面验证
request.getSession().setAttribute(param,verificationCodeText);
BufferedImage image = defaultKaptcha.createImage(verificationCodeText);
ImageIO.write(image,"jpg",outputStream);
captchaChallengeAsJpeg = outputStream.toByteArray();
return Base64.getEncoder().encodeToString(captchaChallengeAsJpeg);
}catch (Exception e){
log.error("生成图片验证码异常"+e);
e.printStackTrace();
}finally {
try {
outputStream.close();
}catch (IOException e){
log.error("生成图片验证码结束,关闭ByteArrayOutputStream资源失败"+e);
e.printStackTrace();
}
}
}
return "验证码生成失败,请重试";
}
第四步:controller层
@ApiOperation(value = "获取图片验证码",notes = "返回ResultDataDto", response = ResultDataDto.class)
@PostMapping(path = "/getPictureCode",consumes = MediaType.APPLICATION_JSON_UTF8_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
public ResultDataDto getPictureCode(HttpServletRequest request){
String param = "ImgVerificationCodeMark";
String base64ImgStr = sysUserService.createPicVerificationCode(param,request);
if (StringUtils.isNotBlank(base64ImgStr) && !base64ImgStr.equals(CREATE_VERIFICATION_CODE_ERROR)){
return ResultDataDto.addOperationSuccess().setData(base64ImgStr);
}else {
return ResultDataDto.addOperationFailure(base64ImgStr);
}
}
第五步:访问测试
http://localhost:8080/getPictureCode返回一个base64编码的图片字符串
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
第六步:利用在线工具测试返回的base64编码的图片验证码字符串是否可以解析http://www.vgot.net/test/image2base64.php
解析结果如下:
image.png