定义注解控制需要避免重复提交的Controller ,应用场景涉及流程和避免造成服务器接口访问压力 @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface AvoidRepeatableCommit { long timeout() default 5 ; String filed() default ""; }
切面
@Aspect @Component @EnableAspectJAutoProxy(exposeProxy=true) public class AvoidRepeatableCommitAspect { @Autowired HttpServletRequest request; @Autowired RedisTemplate<String, Object> redisTemplate; @Around("@annotation(sundun.zfbh.ws.v1.rep.annotation.AvoidRepeatableCommit)") public Object around(ProceedingJoinPoint point) throws Throwable { Object object; String key =""; try { MethodSignature signature = (MethodSignature) point.getSignature(); Method method = signature.getMethod(); AvoidRepeatableCommit avoidRepeatableCommit = method.getAnnotation(AvoidRepeatableCommit.class); String filedName = avoidRepeatableCommit.filed(); String val = (String) request.getAttribute(filedName); key = String.format("%s:%s:%s",RedisConstants.FormKey.CACHE_KEY_FORM_REPEATABLE,SessionUserUtil.getSessionUser().getIdCard(),val); //TODO 待优化,这里有并发问题 Boolean aBoolean = redisTemplate.hasKey(key); if(aBoolean) { object = Result.error("数据重复提交"); }else{ redisTemplate.opsForValue().set(key,0,5000,TimeUnit.SECONDS); object = point.proceed(); redisTemplate.delete(key); } }catch (Exception e){ if(StringUtil.isNotEmpty(key)){ redisTemplate.delete(key); } throw e; } return object; }
使用时
/** * 保存接口 * @param formSaveEntity * @return */ @RequestMapping(value="/saveData", method = RequestMethod.POST) @ResponseBody @AvoidRepeatableCommit(filed = "formId") public JSONObject saveData(FormSaveEntity formSaveEntity){ JSONObject rs ; try{ Map map = formHandleService.saveData(formSaveEntity); rs = Result.success("保存成功").putData(map); }catch (Exception e){ logger.error("保存失败",e); rs = Result.error("保存失败"); } return rs; }