5-9 SpringBoot AOP的使用
Posted 孤注一掷 、
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5-9 SpringBoot AOP的使用相关的知识,希望对你有一定的参考价值。
配置AOP,打印接口耗时、请求参数、返回参数。
新建:
@Aspect
@Component
public class LogAspect
private final static Logger LOG = LoggerFactory.getLogger(LogAspect.class);
/**
* 定义一个切点
*/
@Pointcut("execution(public * com.swk.*.controller..*Controller.*(..))")
public void controllerPointcut()
@Before("controllerPointcut()")
public void doBefore(JoinPoint joinPoint) throws Throwable
// 开始打印请求日志
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
Signature signature = joinPoint.getSignature();
String name = signature.getName();
// 打印请求信息
LOG.info("------------- 开始 -------------");
LOG.info("请求地址: ", request.getRequestURL().toString(), request.getMethod());
LOG.info("类名方法: .", signature.getDeclaringTypeName(), name);
LOG.info("远程地址: ", request.getRemoteAddr());
// 打印请求参数
Object[] args = joinPoint.getArgs();
// LOG.info("请求参数: ", JSONObject.toJSONString(args));
Object[] arguments = new Object[args.length];
for (int i = 0; i < args.length; i++)
if (args[i] instanceof ServletRequest
|| args[i] instanceof ServletResponse
|| args[i] instanceof MultipartFile)
continue;
arguments[i] = args[i];
// 排除字段,敏感字段或太长的字段不显示
String[] excludeProperties = "password", "file";
PropertyPreFilters filters = new PropertyPreFilters();
PropertyPreFilters.MySimplePropertyPreFilter excludefilter = filters.addFilter();
excludefilter.addExcludes(excludeProperties);
LOG.info("请求参数: ", JSONObject.toJSONString(arguments, excludefilter));
@Around("controllerPointcut()")
public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable
long startTime = System.currentTimeMillis();
Object result = proceedingJoinPoint.proceed();
// 排除字段,敏感字段或太长的字段不显示
String[] excludeProperties = "password", "file";
PropertyPreFilters filters = new PropertyPreFilters();
PropertyPreFilters.MySimplePropertyPreFilter excludefilter = filters.addFilter();
excludefilter.addExcludes(excludeProperties);
LOG.info("返回结果: ", JSONObject.toJSONString(result, excludefilter));
LOG.info("------------- 结束 耗时: ms -------------", System.currentTimeMillis() - startTime);
return result;
定义一个切点,*表示不管是什么,都生效,监控所有的controller及其中的所有方法、所有参数。
@Before:前置通知,即执行业务代码之前,我们要去做的事情。
AOP和过滤器拦截器有一点不同,它拿到的参数是通过JoinPoint这个连接点,通过循环结构就可以得到多个参数。有些项目有很多的敏感字段,如身份证号、手机号等等。这些是不能打印的,需要把这些排除掉。包括太长的文本也不需要显示。
如下:
@Around:环绕通知。即围绕业务内容,前面执行一点东西,后面再执行一点东西。
通知三个重要:前置、后置和环绕
整个类叫做切面,即切点和通知结合。
过滤器、拦截器和AOP三选一即可。
这里我们选择AOP,将以下的过滤器和拦截器内容注释掉即可:
以上是关于5-9 SpringBoot AOP的使用的主要内容,如果未能解决你的问题,请参考以下文章
SpringBoot 基础系列接口上注解 AOP 拦截不到场景兼容实例演示