java生成图形验证码
在写项目的时候登录的方式有多种多样,根据需求的不同,有些是用手机号获取验证码登录,有些是需要账号,密码 + 手机验证码登录,还有写是需要账号,密码 + 图形验证码登录,不论怎样搭配大体需要的账号,密码,手机号,验证码。今天就记录下图形验证码的生成。老规矩。先把图贴上
该图形验证码使用的包为:
<dependency>
<groupId>com.github.whvcse</groupId>
<artifactId>easy-captcha</artifactId>
<version>1.6.2</version>
</dependency>
由于我手上的项目登录是需要账号+密码+手机号验证码+图像验证码3重校验所以图形验证码我们使用的是1.6的版本就够了。
废话不多说我直接贴上代码:
@ApiOperation(value = "获取验证码", notes = "获取验证码")
@NoLogging
@GetMapping("/loggincode")
public AjaxResult getCode() {
// gif类型
//GifCaptcha captcha = new GifCaptcha(130, 48);
// 中文类型
//ChineseCaptcha captcha = new ChineseCaptcha(130, 48);
// 中文gif类型
//ChineseGifCaptcha captcha = new ChineseGifCaptcha(130, 48);
// 算术类型
//ArithmeticCaptcha captcha = new ArithmeticCaptcha(130, 48);
// png类型
SpecCaptcha captcha = new SpecCaptcha(130, 48, 4);
/**验证码字符类型
TYPE_DEFAULT 数字和字母混合
TYPE_ONLY_NUMBER 纯数字
TYPE_ONLY_CHAR 纯字母
TYPE_ONLY_UPPER 纯大写字母
TYPE_ONLY_LOWER 纯小写字母
TYPE_NUM_AND_UPPER 数字和大写字母**/
captcha.setCharType(Captcha.TYPE_ONLY_NUMBER);//设置纯数字验证码
// 设置内置字体
// captcha.setFont(Captcha.FONT_1);
// 设置系统字体
// captcha.setFont(new Font("楷体", Font.PLAIN, 28));
//验证码 VUL
String verCode;
if(StringUtils.isNotEmpty(SpringContextUtil.getApplicationContext().getEnvironment().getProperty("sms.enable")) && "false".equals(SpringContextUtil.getApplicationContext().getEnvironment().getProperty("sms.enable"))){
//测试环境的图形验证码为默认值1234
verCode = "1234";
//测试环境登录不发送短信模拟验证码
sendSms(verCode);
}else {
verCode = captcha.text().toLowerCase();
}
//uuid KEY
String key ="login:captcha:"+ UUID.randomUUID().toString().replaceAll("-","");
// 存入redis并设置过期时间为5分钟
stringRedisTemplate.opsForValue().set(key, verCode, 5, TimeUnit.MINUTES);
// 验证码信息
Map imgResult = new HashMap(2) {{
put("img", captcha.toBase64());
put("uuid", key);
}};
return AjaxResult.success(imgResult);
}
private void sendSms(String verCode) {
//校验用户账号密码成功,发送短信验证码 若为开发环境则默认验证码为123456,正式环境则随机生成验证码
if (StringUtils.isNotEmpty(SpringContextUtil.getApplicationContext().getEnvironment().getProperty("sms.enable")) && "false".equals(SpringContextUtil.getApplicationContext().getEnvironment().getProperty("sms.enable"))) {
redisService.setCacheObject(CACHE_KEY_SMS_VALIDATECODE + verCode, "123456", 5L, TimeUnit.MINUTES);
}
}
大概设置就是这样子,可以设置字体,复杂度,组合方式等。生成好的验证码我们存在了Redis中方便登录输入时校验输入准确性。可根据自己项目的需要修改。