package cc.mrbird.febs.common.service;
|
|
import cc.mrbird.febs.common.entity.FebsConstant;
|
import cc.mrbird.febs.common.entity.ImageType;
|
import cc.mrbird.febs.common.exception.FebsException;
|
import cc.mrbird.febs.common.properties.FebsProperties;
|
import cc.mrbird.febs.common.properties.ValidateCodeProperties;
|
import com.wf.captcha.GifCaptcha;
|
import com.wf.captcha.SpecCaptcha;
|
import com.wf.captcha.base.Captcha;
|
import lombok.RequiredArgsConstructor;
|
import org.apache.commons.lang3.StringUtils;
|
import org.springframework.http.HttpHeaders;
|
import org.springframework.http.MediaType;
|
import org.springframework.stereotype.Service;
|
|
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpSession;
|
import java.io.IOException;
|
|
/**
|
* 验证码服务
|
*
|
* @author MrBird
|
*/
|
@Service
|
@RequiredArgsConstructor
|
public class ValidateCodeService {
|
|
private final RedisService redisService;
|
private final FebsProperties properties;
|
|
public void create(HttpServletRequest request, HttpServletResponse response) throws IOException {
|
HttpSession session = request.getSession();
|
String key = session.getId();
|
ValidateCodeProperties code = properties.getCode();
|
setHeader(response, code.getType());
|
|
Captcha captcha = createCaptcha(code);
|
redisService.set(FebsConstant.CODE_PREFIX + key, StringUtils.lowerCase(captcha.text()), code.getTime());
|
captcha.out(response.getOutputStream());
|
}
|
|
|
public void check(String key, String value) throws FebsException {
|
Object codeInRedis = redisService.get(FebsConstant.CODE_PREFIX + key);
|
if (StringUtils.isBlank(value)) {
|
throw new FebsException("请输入验证码");
|
}
|
if (codeInRedis == null) {
|
throw new FebsException("验证码已过期");
|
}
|
if (!StringUtils.equalsIgnoreCase(value, String.valueOf(codeInRedis))) {
|
throw new FebsException("验证码不正确");
|
}
|
}
|
|
private Captcha createCaptcha(ValidateCodeProperties code) {
|
Captcha captcha;
|
if (StringUtils.equalsIgnoreCase(code.getType(), ImageType.GIF)) {
|
captcha = new GifCaptcha(code.getWidth(), code.getHeight(), code.getLength());
|
} else {
|
captcha = new SpecCaptcha(code.getWidth(), code.getHeight(), code.getLength());
|
}
|
captcha.setCharType(code.getCharType());
|
return captcha;
|
}
|
|
private void setHeader(HttpServletResponse response, String type) {
|
if (StringUtils.equalsIgnoreCase(type, ImageType.GIF)) {
|
response.setContentType(MediaType.IMAGE_GIF_VALUE);
|
} else {
|
response.setContentType(MediaType.IMAGE_PNG_VALUE);
|
}
|
response.setHeader(HttpHeaders.PRAGMA, "No-cache");
|
response.setHeader(HttpHeaders.CACHE_CONTROL, "No-cache");
|
response.setDateHeader(HttpHeaders.EXPIRES, 0L);
|
}
|
}
|