package com.dch.service.aop;

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date; import javax.servlet.http.HttpServletRequest; import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes; /**
* AOP Controller RestController
*
* @author liu wp
*
*/
@Aspect
@Component
public class AutoControllerAspect {
private static SimpleDateFormat dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
/** 日志类 */
private final Logger logger = LoggerFactory.getLogger(super.getClass()); /**
* AfterReturning 核心业务逻辑调用正常退出后,不管是否有返回值,正常退出后,均执行
*
* @param joinPoint
* @param returnObj
* 返回值
*/
@AfterReturning(pointcut = "allControllerMethod()||allrestControllerMethod()", returning = "returnObj")
public void afterReturning(final JoinPoint joinPoint, final Object returnObj) {
logger.info("----afterReturning Start 请求时间:{}----", dateTimeFormat.format(new Date()));
logger.info("返回值:{}", returnObj);
logger.info("----afterReturning End 请求时间:{}----", dateTimeFormat.format(new Date())); } /**
* AfterThrowing 核心业务逻辑调用异常退出后执行,处理错误信息
*
* @param joinPoint
* @param ex
* 异常信息
*/
@AfterThrowing(value = "allControllerMethod()||allrestControllerMethod()", throwing = "ex")
public void AfterThrowing(final JoinPoint joinPoint, final Exception ex) {
logger.info("----AfterThrowing Start 请求时间:{}---", dateTimeFormat.format(new Date()));
logger.info("异常信息:{}", ex.getMessage());
logger.info("----AfterThrowing End 请求时间:{}---", dateTimeFormat.format(new Date()));
} /**
* 监控所有@Controller的方法
*/
@Pointcut("within(@org.springframework.stereotype.Controller *)")
public void allControllerMethod() {
} @Pointcut("within(@org.springframework.web.bind.annotation.RestController *)")
public void allrestControllerMethod() {
} /**
* Around 手动控制调用核心业务逻辑,以及调用前和调用后的处理,
*
* 注意:当核心业务抛异常后,立即退出,转向afterReturning 执行完afterReturning,再转到AfterThrowing
*
* @param joinPoint
* @return
* @throws Throwable
*/
@Around("allControllerMethod()||allrestControllerMethod()")
public Object Around(final ProceedingJoinPoint joinPoint) throws Throwable {
logger.info("----Around Start 请求时间:{}----", dateTimeFormat.format(new Date()));
logger.info("---请求前 beforeMethod");
final Object obj = joinPoint.proceed();
logger.info("---请求后 afterReturning");
logger.info("----Around End 请求时间:{}----", dateTimeFormat.format(new Date()));
return obj;
} /**
* 在核心业务执行前执行。
*
* @param joinPoint
* @throws InterruptedException
*/
@Before("allControllerMethod() || allrestControllerMethod()")
public void beforeMethod(final JoinPoint joinPoint) throws InterruptedException {
logger.info("--beforeMethod Start 请求时间:{}--", dateTimeFormat.format(new Date()));
final ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder
.getRequestAttributes();
final HttpServletRequest request = servletRequestAttributes.getRequest();
final String requestUrl = request.getRequestURI().toString();
final int jpsHashCode = joinPoint.getSignature().hashCode();
logger.info("访问序号:{},请求路径:{},访问请求参数对象 : {}", jpsHashCode, requestUrl, Arrays.toString(joinPoint.getArgs()));
logger.info("--beforeMethod End 请求时间:{}--", dateTimeFormat.format(new Date()));
} }

最新文章

  1. sql server多重行列转置的优化
  2. ASP.NET MVC4 URL传递汉字参数不能正确接收
  3. SharePoint Fundation 2013中SecurityTokenServiceApplication错误
  4. android NDK入门 windows下安装cygwin
  5. UVa 102 - Ecological Bin Packing(规律,统计)
  6. ASP.NET Web API路由规
  7. js中的条件语句
  8. 获取app版本号
  9. 判断滑动方向UITableView
  10. mySQL优化 my.ini 配置说明
  11. JSON数据格式介绍
  12. 一个文字无缝滚动的jQuery插件
  13. Linux_window与linux之间文件互传,上传下载
  14. 【USACO】又买饲料 单调队列dp
  15. 浅析String类
  16. 409 javascript if and while表达式
  17. suList() 和 asList()
  18. 一道有意思的多线程面试题 C# 代码实现
  19. C#中委托如何使用?(转帖)
  20. hadoop程序MapReduce之WordCount

热门文章

  1. 泛型2(lambda表达式/参数绑定)
  2. CKEditor编辑器的使用方法
  3. 最短路径SPFA算法(邻接表存法)
  4. POJ-1321-棋盘问题(深搜)
  5. 神奇的Form表单
  6. gnome-terminal
  7. python获取函数参数默认值的两种方法
  8. centos用ifconfig不显示ip地址的解决方法
  9. C++_类继承3-动态联编和静态联编
  10. LeetCode154.寻找旋转排序数组中的最小值 II