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的值由大到小执行

  • 相关阅读:
    Powershell 音乐播放
    Powershell指令集_2
    Powershell指令集_2
    Powershell 邮件发送
    Powershell 邮件发送
    Oracle 11g 关闭内存自动管理
    Oracle 11g 内存手动管理
    Oracle 内存参数调整
    RESTful三理解
    RESTful三理解
  • 原文地址:https://www.cnblogs.com/yang21/p/9959578.html
Copyright © 2011-2022 走看看