zoukankan      html  css  js  c++  java
  • Spring AOP:实现Request信息获取

    关键代码

     ServletRequestAttributes attributes = (ServletRequestAttributes) 
                                RequestContextHolder.getRequestAttributes();
     HttpServletRequest request = attributes.getRequest();

    RequestLogAop

    @Aspect
    @Order(5)
    @Component
    public class RequestLogAop {
    
        private static final Logger LOGGER = LoggerFactory.getLogger(RequestLogAop.class);
    
        private ThreadLocal<RequestInfo> localInfo = new ThreadLocal<>();
    
        @Pointcut("execution(public love.ning.yangxuyue.common.base.ResultBean *(..))")
        public void requestLogAop() {
        }
    
        @Before("requestLogAop()")
        public void outInfo(JoinPoint joinPoint) {
            // 接收到请求,记录请求内容
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            HttpServletRequest request = attributes.getRequest();
            // 记录下请求内容
            RequestInfo info = new RequestInfo();
            info.setUrl(request.getRequestURI());
            info.setIp(request.getRemoteAddr());
            info.setClientPort(request.getRemotePort());
            info.setServerPort(request.getServerPort());
            info.setHttpMethod(request.getMethod());
            info.setClassMethod(joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
            info.setArgs(Arrays.toString(joinPoint.getArgs()));
    
            localInfo.set(info);
    
            System.out.println(info);
        }
    
        @AfterReturning(returning = "body", pointcut = "requestLogAop()")
        public void doAfterReturning(Object body) throws Throwable {
            RequestInfo info = localInfo.get();
            info.setReturnMsg(body);
            // 处理RequestInfo
            System.out.println(info);
            // 删除ThreadLocal中的数据,以防内存泄露问题
            localInfo.remove();
        }
    
       //@AfterThrowing(pointcut = "webPointcut()", throwing = "e")
        //public void handleThrowing(Exception e) {
          //  e.printStackTrace();
          //  logger.error("发现异常!" + e.getMessage());
          //logger.error(JSON.toJSONString(e.getStackTrace()));
        //    //这里输入友好性信息
        //    writeContent("出现异常");
    //    }

    切面的处理顺序问题。

    @Order(i)注解来标识切面的优先级。i的值越小,优先级越高。

    例如:一个切面为@Order(10),而上文中另一个切面为@Order(5)

    在@Before中优先执行@Order(5)的内容,再执行@Order(10)的内容
    在@After和@AfterReturning中优先执行@Order(10)的内容,再执行@Order(5)的内容

    总结:
    在切入点前的操作,按order的值由小到大执行
    在切入点后的操作,按order的值由大到小执行

  • 相关阅读:
    阅读心得10:《京东咚咚架构演进 》
    hadoop beginning
    ubuntu docker
    Ubuntu学习——第一篇
    flexsim diary
    apollo 3.0 硬件系统
    这是一份详细的Apollo自动驾驶平台上手指南
    详解百度Apollo感知技术、高精地图和小度车载系统
    Apollo 2.5推基于动态的实时相对地图解决方案
    Apollo在功能安全方面的探索
  • 原文地址:https://www.cnblogs.com/yang21/p/9959578.html
Copyright © 2011-2022 走看看