package com.doumee.core.annotation.pr;
|
|
import com.alibaba.fastjson.JSON;
|
import com.doumee.service.business.third.model.ApiResponse;
|
import com.doumee.core.constants.ResponseStatus;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.BeansException;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.context.ApplicationContext;
|
import org.springframework.stereotype.Component;
|
import org.springframework.web.method.HandlerMethod;
|
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
|
|
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletResponse;
|
import java.lang.reflect.Method;
|
|
/**
|
* 防重复提交处理
|
* @author Eva.Caesar Liu
|
* @date 2023/03/21 14:49
|
*/
|
@Slf4j
|
@Component
|
public class PreventRepeatInterceptor extends HandlerInterceptorAdapter {
|
|
private static ApplicationContext applicationContext;
|
|
@Override
|
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
|
if (!(handler instanceof HandlerMethod)) {
|
return Boolean.TRUE;
|
}
|
try {
|
HandlerMethod handlerMethod = (HandlerMethod) handler;
|
Method method = handlerMethod.getMethod();
|
PreventRepeat prAnnotation = method.getAnnotation(PreventRepeat.class);
|
// 接口未添加防重复提交注解
|
if (prAnnotation == null) {
|
return Boolean.TRUE;
|
}
|
// 获取验证对象和方法
|
PreventRepeatAdapter adapter = (PreventRepeatAdapter)applicationContext.getBean(prAnnotation.value());
|
// 验证暴力请求
|
if(prAnnotation.limit() > 0 && prAnnotation.lockTime() > 0 && adapter.massive(request, prAnnotation.limit(), prAnnotation.lockTime())) {
|
log.warn("Eva Intercept a massive request,url:{}", request.getRequestURI());
|
response.setHeader("content-type", "application/json;charset=UTF-8");
|
ApiResponse apiResponse = ApiResponse.failed(ResponseStatus.MASSIVE_REQUEST);
|
if (!"".equals(prAnnotation.message())) {
|
apiResponse.setMessage(prAnnotation.message());
|
}
|
response.getWriter().write(JSON.toJSONString(apiResponse));
|
return Boolean.FALSE;
|
}
|
// 验证重复请求
|
if(prAnnotation.interval() > 0 && adapter.prevent(request, prAnnotation.interval())) {
|
log.warn("Eva Intercept a repeat request,url:{}", request.getRequestURI());
|
response.setHeader("content-type", "application/json;charset=UTF-8");
|
ApiResponse apiResponse = ApiResponse.failed(ResponseStatus.REPEAT_REQUEST);
|
if (!"".equals(prAnnotation.limitMessage())) {
|
apiResponse.setMessage(prAnnotation.limitMessage());
|
}
|
response.getWriter().write(JSON.toJSONString(apiResponse));
|
return Boolean.FALSE;
|
}
|
} catch (Exception e) {
|
log.warn("Eva @PreventRepeat throw an exception, you can get detail message by debug mode");
|
log.debug(e.getMessage(), e);
|
}
|
return Boolean.TRUE;
|
}
|
|
@Autowired
|
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
|
if (PreventRepeatInterceptor.applicationContext == null) {
|
PreventRepeatInterceptor.applicationContext = applicationContext;
|
}
|
}
|
}
|