aop切面和自定义注解
时间:2021-11-30
本文章向大家介绍aop切面和自定义注解,主要包括aop切面和自定义注解使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
package com.lanfu.storehouse.annotation;
//先自定义一个注解 import java.lang.annotation.*; @Inherited @Documented @Target({ElementType.FIELD,ElementType.TYPE,ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface AccessLimit { //标识 指定sec时间段内的访问次数限制 int limit() default 5; //标识 时间段 int sec() default 5; }
写一个切面
package com.lanfu.storehouse.aspect; import com.lanfu.storehouse.annotation.AccessLimit; import com.lanfu.storehouse.common.base.ErrorCodeEnum; import com.lanfu.storehouse.common.exception.BaseBussinessException; import com.lanfu.storehouse.common.util.IpAddressUtil; import com.lanfu.storehouse.common.util.RedisUtil; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; @Aspect @Component @Slf4j public class AccessLimitAspectAdvice { @Pointcut("@annotation(com.lanfu.storehouse.annotation.AccessLimit)") private void entryPoint(){ } @Around("entryPoint()&& @annotation(accessLimit)") public Object accessLimit(ProceedingJoinPoint joinPoint, AccessLimit accessLimit) throws Throwable { //获取HttpServletRequest RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) requestAttributes; HttpServletRequest request = servletRequestAttributes.getRequest(); //获取注解中的参数 int limit = accessLimit.limit(); int sec = accessLimit.sec(); //使用ip加接口作为key存到redis中 String key = IpAddressUtil.getIpAddr(request) + request.getRequestURI(); Integer maxLimit = (Integer) RedisUtil.get(key); if (maxLimit == null) { //set时一定要加过期时间 RedisUtil.set(key, 1, sec); } else if (maxLimit < limit) { RedisUtil.set(key, maxLimit + 1, sec); } else { throw new BaseBussinessException(ErrorCodeEnum.GW10019013); } System.out.println("joinPoint = " + joinPoint.toString()); System.out.println("joinPoint = " + joinPoint.proceed().toString()); return joinPoint.proceed(); } }
使用
@RequestMapping(method = RequestMethod.POST, value = "/apiCallBack") @ResponseBody @AccessLimit(limit = 10,sec = 5) public BaseResult apiCallBack(@RequestBody Map map, HttpServletRequest httpServletRequest){ System.out.println(map.toString()); // String appId = requestMessageVo.getAppId(); // String content = requestMessageVo.getContent(); // Long timestamp = requestMessageVo.getTimestamp(); // String concatString = appId+"507f513353702b50c145d5b7d138095c"+content+timestamp; // String sign = requestMessageVo.getSign(); // String md5String = MD5Util.md5(concatString); // if (!md5String.equals(sign)){ // throw new BaseBussinessException(ErrorCodeEnum.GW10019002); // } // System.out.println("===回调参数==="+content); return BaseResult.error(); }
//打印出来的东西。
joinPoint = execution(BaseResult com.lanfu.storehouse.controller.GuCangAPIController.apiCallBack(Map,HttpServletRequest))
joinPoint = com.lanfu.storehouse.common.base.BaseResult@39924a6f
原文地址:https://www.cnblogs.com/zhuxiang1029/p/15624658.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- UNIX网络编程卷1(第三版)一个简单的时间获取服务器的程序
- Python数据分析实战(3)Python实现数据可视化
- xresloader转表工具链增加了一些新功能(map,oneof支持,输出矩阵,基于模板引擎的加载代码生成等)
- 数据结构之树
- UNIX网络编程卷1(第三版)套接字编程简介
- UNIX网络编程卷1(第三版)readn,writen和readline函数
- UNIX网络编程卷1(第三版)基本TCP套接字编程
- Ubuntu下linux映射共享盘到window下方法
- 数据同步写入磁盘:sync
- 惯用的关机命令:shutdown
- 重启、关机:reboot,halt,poweroff
- 使用Docker构建ZooKeeper镜像
- Linux进程间的通信
- 如何使用jMeter对需要CSRF token验证的OData服务进行并发性能测试
- 如何让SAP C4C自定义BO实现附件上传的功能