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