feat: 新增CaptchaService实现类

This commit is contained in:
weihongyang 2022-06-23 13:54:11 +08:00
부모 42de3bd79c
커밋 04f1bb339e

파일 보기

@ -0,0 +1,77 @@
package com.cnbm.admin.service.impl;
import com.cnbm.admin.service.CaptchaService;
import com.cnbm.common.redis.RedisKeys;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.wf.captcha.SpecCaptcha;
import com.wf.captcha.base.Captcha;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
/**
* @Author weihongyang
* @Date 2022/6/23 12:29 PM
* @Version 1.0
*/
@Service
public class CaptchaServiceImpl implements CaptchaService {
@Autowired
private RedisTemplate redisTemplate;
/**
* Local Cache 5分钟过期
*/
Cache<String, String> localCache = CacheBuilder.newBuilder().maximumSize(1000).expireAfterAccess(5, TimeUnit.MINUTES).build();
@Override
public void create(HttpServletResponse response, String uuid) throws IOException {
response.setContentType("image/gif");
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
//生成验证码
SpecCaptcha captcha = new SpecCaptcha(150, 40);
captcha.setLen(5);
captcha.setCharType(Captcha.TYPE_DEFAULT);
captcha.out(response.getOutputStream());
//保存到缓存
setCache(uuid, captcha.text());
}
@Override
public boolean validate(String uuid, String code) {
//获取验证码
String captcha = getCache(uuid);
//效验成功
if(code.equalsIgnoreCase(captcha)){
return true;
}
return false;
}
private void setCache(String key, String value){
key = RedisKeys.getCaptchaKey(key);
redisTemplate.opsForValue().set(key, value, 300,TimeUnit.SECONDS);
}
private String getCache(String key){
key = RedisKeys.getCaptchaKey(key);
String captcha = (String)redisTemplate.opsForValue().get(key);
//删除验证码
if(captcha != null){
redisTemplate.delete(key);
}
return captcha;
}
}