欢迎访问我的个人博客:guqing’s blog
创建AOP
@Aspect
@Component
public class LoggerAop {
//本地日志记录对象
private static final Logger logger = LoggerFactory.getLogger(LoggerAop.class);
//controller切点
@Pointcut("execution(* xyz.guqing.taotao.manage.controller.*.*(..))")
public void pointCut(){}
@Around(value="pointCut()")
public Object doAroundAdvice(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
//获取request对象
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
//还可以使用request获取session中的用户名并记录到日志
//获取请求的ip
String ip = request.getRemoteAddr();
//获取请求方法全限定名
String methodName = proceedingJoinPoint.getTarget().getClass().getName() + "." + proceedingJoinPoint.getSignature().getName();
//获取方法执行返回值
Object returningValue = proceedingJoinPoint.proceed();
//方法参数
String params = JSONArray.toJSONString(proceedingJoinPoint.getArgs());
//返回值转为json数组
String returnJsonValue = JSONArray.toJSONString(returningValue);
logger.info("请求ip地址:{},请求方法全名:{},请求参数:{},返回值:{}", ip, methodName, params, returnJsonValue);
//对于环绕方法必须接收方法执行后的结果并返回,否则会导致视图获取不到返回值,或者直接就找不到视图
return returningValue;
}
/**
* @Description: 当方法执行抛出异常时执行
* @param: @param joinPoint
* @param: @param e
* @param: @throws Throwable 异常
* @return: void
* @throws
*/
@AfterThrowing(value="pointCut()",throwing="e")
public void doAfterThrowing(JoinPoint joinPoint,Throwable e) throws Throwable {
//获取request对象
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
//获取请求的ip
String ip = request.getRemoteAddr();
//异常方法
String methodName = joinPoint.getTarget().getClass().getName() + "." + joinPoint.getSignature().getName();
//异常信息
String errorInfo = e.getMessage();
//请求参数
String params = JSONArray.toJSONString(joinPoint.getArgs());
logger.error("异常请求ip:{},异常方法全名:{},异常信息:{},请求参数:{}",ip,methodName,errorInfo,params);
}
}
在Springmvc的配置文件中开启AOP自定代理
<!-- 开启aop自动代理 -->
<aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
注意:
1. 不要将AOP自动代理的配置添加到applicationContext.xml
中,要添加在springmvc
的配置文件中,否则AOP
切面不执行。
2. 切记环绕方法,要将方法执行结果返回,否则即时路径是对的会找不到视图,或者执行后视图得不到响应结果。