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