1.自定义注解类
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface ReqFastLimit { //redis key String key() default ""; //过期时间 单位秒 long expire() default 60L; // 前缀 String prefix() default ""; }
2.定义切面
@Aspect @Component @Slf4j @SuppressWarnings("ALL") public class ReqFastHandler { @Autowired private RedisTemplate redisTemplate; @Autowired private HttpServletRequest request; @Around(("@annotation(reqFastLimit)")) public Object around(ProceedingJoinPoint joinPoint, ReqFastLimit reqFastLimit) throws Throwable { String requestURI = request.getRequestURI(); String keySpel = reqFastLimit.key(); long expire = reqFastLimit.expire(); String prefix = reqFastLimit.prefix(); Object[] args = joinPoint.getArgs(); Method method = ((MethodSignature) joinPoint.getSignature()).getMethod(); //获取被拦截方法参数名列表(使用Spring支持类库) LocalVariableTableParameterNameDiscoverer localVariableTable = new LocalVariableTableParameterNameDiscoverer(); String[] paraNameArr = localVariableTable.getParameterNames(method); //使用SPEL进行key的解析 ExpressionParser parser = new SpelExpressionParser(); //SPEL上下文 StandardEvaluationContext context = new StandardEvaluationContext(); //把方法参数放入SPEL上下文中 for (int i = 0; i < paraNameArr.length; i++) { context.setVariable(paraNameArr[i], args[i]); } String key = null; // 使用变量方式传入业务动态数据 if (keySpel.matches("^#.*.$")) { String[] split = keySpel.split(","); for (String s : split) { if (key == null) { key = parser.parseExpression(s).getValue(context, String.class); } else { key = key + ":" + parser.parseExpression(s).getValue(context, String.class); } } } try { Boolean result = redisTemplate.opsForValue().setIfAbsent(prefix + key, key, expire, TimeUnit.SECONDS); if (!result) { log.info("key={}", prefix + key); throw new Exception("您手速真快,慢点吧!"); } return joinPoint.proceed(); } catch (CustomException e) { throw e; } finally { //代码逻辑执行完释放锁 redisTemplate.delete(prefix + key); } }
3.注解使用
@ReqFastLimit(key = "#test.orderNo,#test.channo", expire = 3, prefix = "test") public ResultVo test(@RequestBody @Valid Test test) { return testService.test(test); }
4.效果
原文地址:http://www.cnblogs.com/blackCatFish/p/16886342.html
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,请务用于商业用途!
3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员!
8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载
声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性