博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringBoot Aop打印参数
阅读量:5308 次
发布时间:2019-06-14

本文共 3668 字,大约阅读时间需要 12 分钟。

import java.util.Enumeration;import javax.servlet.http.HttpServletRequest;import lombok.extern.slf4j.Slf4j;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.After;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.annotation.Pointcut;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;import org.springframework.util.StopWatch;import org.springframework.web.context.request.RequestContextHolder;import org.springframework.web.context.request.ServletRequestAttributes;/** * @author kelin.ll * @date on 2019/6/5 */@Aspect@Component@Slf4jpublic class AuthAspect {
/** * 这个切点的表达式需要根据自己的项目来写 * 说明: * execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern)throws-pattern?) * 修饰符匹配(modifier-pattern?) * 返回值匹配(ret-type-pattern)可以为*表示任何返回值,全路径的类名等 * 类路径匹配(declaring-type-pattern?) * 方法名匹配(name-pattern)可以指定方法名 或者 *代表所有, set* 代表以set开头的所有方法 * 参数匹配((param-pattern))可以指定具体的参数类型,多个参数间用“,”隔开,各个参数也可以用“*”来表示匹配任意类型的参数,如(String)表示匹配一个String参数的方法;(*,String) 表示匹配有两个参数的方法,第一个参数可以是任意类型,而第二个参数是String类型;可以用(..)表示零个或多个任意参数 * 异常类型匹配(throws-pattern?) * 其中后面跟着“?”的是可选项 * * 如: * 1)execution(* *(..)) 表示匹配所有方法 * 2)execution(public * com. savage.service.UserService.*(..)) 表示匹配com.savage.server.UserService中所有的公有方法 * 3)execution(* com.savage.server..*.*(..)) 表示匹配com.savage.server包及其子包下的所有方法 */ @Pointcut("execution(public * com.anole.manager.controller.RealTimeApiController.*(..))") public void auth() { } @Before("auth()") public void doBefore(JoinPoint joinPoint) { log.info("aop doBefore.."); ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); //url log.info("url={}", request.getRequestURI()); //method log.info("method={}", request.getMethod()); //ip log.info("ip={}", request.getRemoteAddr()); //类方法 log.info("classMethod={}", joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName()); //参数 Enumeration
paramter = request.getParameterNames(); while (paramter.hasMoreElements()) { String str = (String)paramter.nextElement(); log.info(str + "={}", request.getParameter(str)); } } @Around("auth()") public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { StopWatch stopWatch = new StopWatch(); // 耗时计算-开始 stopWatch.start(); ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); //参数 Enumeration
paramter = request.getParameterNames(); while (paramter.hasMoreElements()) { String str = (String)paramter.nextElement(); log.info(str + "={}", request.getParameter(str)); } // TODO 可在此处实现鉴权逻辑,修改返回response Object returnObj = proceedingJoinPoint.proceed(); // 耗时计算-结束 stopWatch.stop(); log.info("【{}方法】耗时:{}", proceedingJoinPoint.getSignature().getName(), stopWatch.getTotalTimeMillis()); return returnObj; } @After("auth()") public void doAfter() { log.info("aop doAfter"); }}

 

转载于:https://www.cnblogs.com/gisblogs/p/10999202.html

你可能感兴趣的文章
Maven(八) Maven项目和testng结合应用
查看>>
iOS 的 set.get.构造方法
查看>>
无法根据中文查找
查看>>
文件编码,文件或文件名编码格式转换(转)
查看>>
[简讯]phpMyAdmin项目已迁移至GitHub
查看>>
redis的hash与string区别
查看>>
转载 python多重继承C3算法
查看>>
初用Ajax
查看>>
zabbix 2.2.20 安装详解(Centos6.9)
查看>>
【题解】 bzoj1597: [Usaco2008 Mar]土地购买 (动态规划+斜率优化)
查看>>
css文本溢出显示省略号
查看>>
SQL_Server_2008完全学习之第十章触发器
查看>>
git安装和简单配置
查看>>
C# FTP远程服务器返回错误:(550) 文件不可用(例如,未找到文件,无法访问文件)...
查看>>
面向对象:反射,双下方法
查看>>
利用matplotlib绘画出二特征的散点图
查看>>
RabiitMq
查看>>
WebForm 发送邮箱
查看>>
鼠标悬停提示文本消息最简单的做法
查看>>
# C++中对PI的引用
查看>>