天天看點

Java - 過濾器,攔截器,切面的差別及說明

1,過濾器

    什麼是過濾器:可以拿到原始的http請求,拿不到請求控制器及控制器的方法

    攔截web通路url位址

   過濾器依賴于servlet容器,攔截器不依賴servlet容器

   過濾器是基于函數回調 

   過濾器可以對幾乎所有的請求起作用

2,攔截器

    什麼是攔截器:可以拿到你請求的控制器及方法,拿不到方法的參數資訊

    攔截以 .action結尾的url,攔截Action的通路。.action可以配置任意結尾

   攔截器不依賴servlet容器,過濾器依賴于servlet容器

   攔截器是基于java的反射機制,使用代理模式

   攔截器隻能對action起作用

   攔截器可以通路action上下文

   攔截器可以在攔截的前或後進行處理。

3,切面

    什麼是切面:可以拿到方法的參數資訊,拿不到http的請求和響應的對象

    隻能攔截Spring管理Bean的通路

    攔截器隻能擷取到類和方法的資訊,但是對于方法中參數的值、和方法執行完畢後傳回的資料,攔截器是得不到的,我們可以通過切面來擷取。

@Aspect注解是切面注解類
@Pointcut切點定義
@Before是方法執行前調用
@After是方法執行後調用
@AfterReturning方法執行傳回值調用
@Around : 執行順序   @Around 》@Before》@Around 》@After
在切面中,可以擷取到請求的參數,也可以擷取到響應值,并且我們可以對參數和響應值做出一定修改并生效
           
  • import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.*;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Component;
     
    import java.util.Arrays;
     
    @Component
    @Aspect
    public class TimeAspect {
     
        private Logger logger = LoggerFactory.getLogger(getClass());
     
        @Pointcut("execution(* com.mright.security.demo.platform.controller.UserController.*(..))")
        public void user() {
     
        }
     
        @Before("user()")
        public void beforeControllerMethod(JoinPoint joinPoint) {
            logger.info("進入TimeAspect切面,執行之前");
        }
     
        @Around("user()")
        public Object handleControllerMethod(ProceedingJoinPoint pjp) throws Throwable {
            logger.info("進入TimeAspect切面");
            Object[] args = pjp.getArgs();
            Arrays.asList(args).forEach(arg -> logger.info(arg.toString()));
            long start = System.currentTimeMillis();
            Object obj = pjp.proceed();
            logger.info(obj.toString());
            logger.info("執行耗時 : " + (System.currentTimeMillis() - start) + "ms");
            return obj;
        }
     
        @After("user()")
        public void afterControllerMethod(JoinPoint joinPoint) {
            logger.info("進入TimeAspect切面,執行之後");
        }
        
        @AfterReturning(returning = "result", pointcut = "user()")
        public void doAfterReturnint(Object result) {
            logger.info("方法傳回值:" + result.toString());
        }
    }
               
    Java - 過濾器,攔截器,切面的差別及說明