java 后台防止重复提交(注解方式)
/** * 自定义注解防止表单重复提交 * * @author framework */ @Inherited @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface RepeatSubmit { /** * 间隔时间(ms),小于此时间视为重复提交 */ int interval() default 500; TimeUnit timeUnit() default TimeUnit.MILLISECONDS; /** * 提示消息 */ String message() default "请勿重复提交,请稍候再试"; }
/** * 防止重复提交 * * @author framework */ @Slf4j @RequiredArgsConstructor @Aspect @Component public class RepeatSubmitAspect { @Before("@annotation(repeatSubmit)") public void doBefore(JoinPoint point, RepeatSubmit repeatSubmit) throws Throwable { // 如果注解不为0 则使用注解数值 long interval = repeatSubmit.timeUnit().toMillis(repeatSubmit.interval()); HttpServletRequest request = ServletUtils.getRequest(); String nowParams = LogUtil.argsArrayToString(point.getArgs()); // 请求地址(作为存放cache的key值) String url = request.getRequestURI(); // 唯一值(没有消息头则使用请求地址) String submitKey = StringUtils.trimToEmpty(request.getHeader(SaManager.getConfig().getTokenName())); submitKey = SecureUtil.md5(submitKey + ":" + nowParams); // 唯一标识(指定key + url + 消息头) String cacheRepeatKey = ConstantsUtil.REPEAT_SUBMIT_KEY + url + submitKey; String key = RedisUtils.getCacheObject(cacheRepeatKey); if (key == null) { RedisUtils.setCacheObject(cacheRepeatKey, "", interval, TimeUnit.MILLISECONDS); } else { throw new ServiceException(repeatSubmit.message()); } } }
public class LogUtil { /** * 参数拼装 */ public static String argsArrayToString(Object[] paramsArray) { StringBuilder params = new StringBuilder(); if (paramsArray != null && paramsArray.length > 0) { for (Object o : paramsArray) { if (ObjectUtil.isNotNull(o) && !LogUtil.isFilterObject(o)) { try { params.append(JsonUtils.toJsonString(o)).append(" "); } catch (Exception e) { e.printStackTrace(); } } } } return params.toString().trim(); } /** * 判断是否需要过滤的对象。 * * @param o 对象信息。 * @return 如果是需要过滤的对象,则返回true;否则返回false。 */ @SuppressWarnings("rawtypes") public static boolean isFilterObject(final Object o) { Class<?> clazz = o.getClass(); if (clazz.isArray()) { return clazz.getComponentType().isAssignableFrom(MultipartFile.class); } else if (Collection.class.isAssignableFrom(clazz)) { Collection collection = (Collection) o; for (Object value : collection) { if (value instanceof MultipartFile) { return true; } } } else if (Map.class.isAssignableFrom(clazz)) { Map map = (Map) o; for (Object value : map.entrySet()) { Map.Entry entry = (Map.Entry) value; if (entry.getValue() instanceof MultipartFile) { return true; } } } return o instanceof MultipartFile || o instanceof HttpServletRequest || o instanceof HttpServletResponse || o instanceof BindingResult; } }
在需要防止重复提交controller层方法中,添加注解 @RepeatSubmit()
本文来自博客园,作者:路易蓝,转载请注明原文链接:https://www.cnblogs.com/luyilan/p/17754907.html