Java - 过滤器,拦截器,切面的区别及说明

本文介绍了过滤器、拦截器和切面的主要区别和应用场景。过滤器依赖于Servlet容器,主要用于预处理HTTP请求,而拦截器不依赖容器,常用于Struts等框架中,获取控制器信息。切面则通过AOP实现,能够获取方法参数,适用于Spring管理Bean的访问。详细阐述了各自的工作机制和使用示例。
摘要由CSDN通过智能技术生成

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());
        }
    }

     

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值