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); } }