天天看点

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 - 过滤器,拦截器,切面的区别及说明