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 - 過濾器,攔截器,切面的差別及說明