package cn.exrick.xboot.core.config.security.validate;
|
|
import cn.exrick.xboot.core.common.constant.CommonConstant;
|
import cn.exrick.xboot.core.common.redis.RedisTemplateHelper;
|
import cn.exrick.xboot.core.common.utils.ResponseUtil;
|
import cn.exrick.xboot.core.common.vo.EmailValidate;
|
import cn.exrick.xboot.core.config.properties.CaptchaProperties;
|
import cn.hutool.core.util.StrUtil;
|
import com.google.gson.Gson;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.context.annotation.Configuration;
|
import org.springframework.util.PathMatcher;
|
import org.springframework.web.filter.OncePerRequestFilter;
|
|
import javax.servlet.FilterChain;
|
import javax.servlet.ServletException;
|
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletResponse;
|
import java.io.IOException;
|
|
/**
|
* 图形验证码过滤器
|
* @author Exrick
|
*/
|
@Slf4j
|
@Configuration
|
public class EmailValidateFilter extends OncePerRequestFilter {
|
|
@Autowired
|
private CaptchaProperties captchaProperties;
|
|
@Autowired
|
private RedisTemplateHelper redisTemplate;
|
|
@Autowired
|
private PathMatcher pathMatcher;
|
|
@Override
|
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException {
|
|
// 判断URL是否需要验证
|
Boolean flag = false;
|
String requestUrl = request.getRequestURI();
|
for (String url : captchaProperties.getEmail()) {
|
if (pathMatcher.match(url, requestUrl)) {
|
flag = true;
|
break;
|
}
|
}
|
if (flag) {
|
String email = request.getParameter("email");
|
String code = request.getParameter("code");
|
if (StrUtil.isBlank(email) || StrUtil.isBlank(code)) {
|
ResponseUtil.out(response, ResponseUtil.resultMap(false, 500, "请传入邮件验证码所需参数email或code"));
|
return;
|
}
|
String v = redisTemplate.get(CommonConstant.PRE_EMAIL + email);
|
if (StrUtil.isBlank(v)) {
|
ResponseUtil.out(response, ResponseUtil.resultMap(false, 500, "验证码已过期,请重新获取"));
|
return;
|
}
|
EmailValidate e = new Gson().fromJson(v, EmailValidate.class);
|
if (!code.equals(e.getCode())) {
|
log.info("验证码错误:code:" + code + ",redisCode:" + e.getCode());
|
ResponseUtil.out(response, ResponseUtil.resultMap(false, 500, "邮件验证码输入错误"));
|
return;
|
}
|
// 已验证清除key
|
redisTemplate.delete(CommonConstant.PRE_EMAIL + email);
|
// 验证成功 放行
|
chain.doFilter(request, response);
|
return;
|
}
|
// 无需验证 放行
|
chain.doFilter(request, response);
|
}
|
}
|