package cc.mrbird.febs.auth.service.impl; import cc.mrbird.febs.auth.properties.FebsAuthProperties; import cc.mrbird.febs.auth.properties.FebsValidateCodeProperties; import cc.mrbird.febs.auth.service.ValidateCodeService; import cc.mrbird.febs.common.core.entity.constant.FebsConstant; import cc.mrbird.febs.common.core.entity.constant.ImageTypeConstant; import cc.mrbird.febs.common.core.entity.constant.ParamsConstant; import cc.mrbird.febs.common.core.exception.ValidateCodeException; import cc.mrbird.febs.common.redis.service.RedisService; 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 java.io.IOException; /** * 验证码服务 * * @author MrBird */ @Service @RequiredArgsConstructor public class ValidateCodeServiceImpl implements ValidateCodeService { private final RedisService redisService; private final FebsAuthProperties properties; @Override public void create(HttpServletRequest request, HttpServletResponse response) throws IOException, ValidateCodeException { String key = request.getParameter(ParamsConstant.VALIDATE_CODE_KEY); if (StringUtils.isBlank(key)) { throw new ValidateCodeException("验证码key不能为空"); } FebsValidateCodeProperties 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()); } @Override public void check(String key, String value) throws ValidateCodeException { Object codeInRedis = redisService.get(FebsConstant.CODE_PREFIX + key); if (StringUtils.isBlank(value)) { throw new ValidateCodeException("请输入验证码"); } if (codeInRedis == null) { throw new ValidateCodeException("验证码已过期"); } if (!StringUtils.equalsIgnoreCase(value, String.valueOf(codeInRedis))) { throw new ValidateCodeException("验证码不正确"); } } private Captcha createCaptcha(FebsValidateCodeProperties code) { Captcha captcha = null; if (StringUtils.equalsIgnoreCase(code.getType(), ImageTypeConstant.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, ImageTypeConstant.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); } }