在Spring中使用过滤器、拦截器,分析过滤器、拦截器和AOP的关系及区别

框架给我们的开发带来很多便利的地方,而许多从前学习到的一些知识的使用,在框架中会稍有不同,该文章主要对过滤器和拦截器在框架中的使用进行描述,并分析过滤器、拦截器和AOP的关系及区别

过滤器

过滤器的作用主要是对路径匹配的请求进行拦截,然后对请求进行相应处理后,再将请求放行去执行原来的处理逻辑。

在这里插入图片描述

当有多个过滤器时,会形成一个过滤器链,会逐一执行,只有在请求路径匹配时,才会被过滤器拦截

使用

创建一个类,实现Filter接口,并重写doFilter()方法

@Slf4j
public class TimeFilter implements Filter {
    private SimpleDateFormat simpleDateFormat= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:S");
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        log.info("TimeFilter拦截的时间:{}",simpleDateFormat.format(new Date(System.currentTimeMillis())));
        chain.doFilter(request, response);
        log.info("执行完请求处理逻辑后,回到TimeFilter的时间:{}",simpleDateFormat.format(new Date(System.currentTimeMillis())));
    }
}

创建配置类,利用方法创建过滤器并放入容器中

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Bean
    public FilterRegistrationBean TimeFilter(){
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        TimeFilter timeFilter = new TimeFilter();
        filterRegistrationBean.setFilter(timeFilter);
        // 添加拦截路径
        filterRegistrationBean.addUrlPatterns("/filter/*");
        Set<String> path = new HashSet<>();
        // 多路径情况
        // path.add("/filter/test1");
        // path.add("/filter/test2");
        // filterRegistrationBean.setUrlPatterns(path);
        // 设置过滤器的执行顺序
        filterRegistrationBean.setOrder(1);
        return filterRegistrationBean;
    }
}
测试

请求接口并查看日志信息

在这里插入图片描述

在日志信息可以看到,请求成功被过滤器拦截


拦截器

拦截器也是根据请求路径来进行拦截的,拦截器类似于Aop,都是使用代理模式实现的,它可对你所需访问的接口方法的执行前后进行操作。在框架中,可以通过实现HandlerInterceptor接口来创建拦截器,需重写preHandle()、postHandle()、afterCompletion()三个方法。

在这里插入图片描述

使用

创建一个类,实现HandlerInterceptor接口并重写preHandle()、postHandle()、afterCompletion()方法

@Slf4j
@Component
public class TimeInterceptor implements HandlerInterceptor {
    private SimpleDateFormat simpleDateFormat= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:S");
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.info("调用TimeInterceptor中的preHandle()方法的时间:{}",simpleDateFormat.format(new Date(System.currentTimeMillis())));
        // 只有返回值为true时,才能够继续执行postHandle()、afterCompletion()方法,若是false表示请求结束,将会不再执行
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        log.info("调用TimeInterceptor中的postHandle()方法的时间:{}",simpleDateFormat.format(new Date(System.currentTimeMillis())));
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        log.info("调用TimeInterceptor中的afterCompletion()方法的时间:{}",simpleDateFormat.format(new Date(System.currentTimeMillis())));
    }
}

在配置类中,把拦截器添加到容器中,并设置拦截路径

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Autowired
    private TimeInterceptor timeInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(timeInterceptor).addPathPatterns("/interceptor/*");
//        多路径配置
//        List<String> path = new ArrayList<>();
//        path.add("/interceptor/test1");
//        path.add("/interceptor/test2");
//        registry.addInterceptor(timeInterceptor).addPathPatterns(path);
    }
}
测试

请求接口并查看日志信息

在这里插入图片描述

在日志中可以看到,拦截器已经成功拦截到了请求,并执行了三个方法


过滤器、拦截器、Aop

执行顺序

当过滤器、拦截器、Aop都用于一个请求路径的接口方法时,执行顺序为 过滤器-》拦截器-》AOP

在这里插入图片描述

作用
过滤器的主要作用
  • 用户访问权限处理
  • 设置字符集乱码处理
  • 过滤敏感词汇、压缩响应信息
拦截器的主要作用
  • 只能拦截请求,可以访问上下文等对象,功能强大,一个请求可多次拦截。
  • 用户访问权限处理
  • 登记日志
AOP的主要作用
  • 日志记录

  • 性能统计

  • 安全控制

  • 事务处理

  • 异常处理

  • 只能应用于由 Spring 容器管理的 bean

一般情况下,数据被过滤拦截的时机越早对服务的性能影响越小,在编写相对比较公用的代码时,优先考虑过滤器,然后是拦截器,最后是AOP

区别
  • 过滤器与拦截器的拦截是通过匹配请求路径实现的,而AOP(面向切面)拦截可以通过切点切向包、类、方法名、参数等

  • Spring AOP和拦截器一样,都是AOP的实现方式的一种,均使用代理模式实现

  • Aop能够对包、类、方法名、参数等拦截,相对于拦截其而言,更加灵活,Aop可以针对具体的代码,去实现更加复杂的业务逻辑

  • 拦截器只对action负责,作用层面一般位于Controller层,Spring AOP主要是拦截对Spring管理的Bean的访问,一般作用与Service层

参考

Spring 过滤器 拦截器 AOP区别

最详细的讲解过滤器,拦截器,AOP的区别


本文若有任何出错或理解有误的地方,请帮忙指出,谢谢

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring拦截器过滤器AOPSpring框架常用的三种技术,用于实现对请求的处理和控制。它们的作用和使用方式有一些不同,我会分别对它们进行简单解释。 1. 过滤器(Filter): 过滤器Java Servlet规范提供的一种技术,用于在请求到达Servlet之前或响应返回给客户端之前拦截和处理请求。过滤器可以在Web应用的整个生命周期起作用,对所有请求都生效。常见的应用场景包括:编码转换、身份认证、日志记录等。 2. 拦截器(Interceptor): 拦截器Spring框架提供的一种技术,用于在请求到达Handler(Controller方法)之前或响应返回给客户端之前对请求进行拦截和处理。拦截器只在Spring MVC起作用,用于实现对请求的预处理和后处理。常见的应用场景包括:身份认证、权限控制、日志记录等。 3. AOP(面向切面编程): AOP是一种编程思想,也是Spring框架提供的一种技术。通过AOP,可以将与业务逻辑无关的横切关注点(如日志、事务管理等)从业务逻辑解耦出来,以模块化的方式进行管理。在SpringAOP通常通过动态代理实现,可以在方法执行前、后或抛出异常时进行一些额外的处理。AOP常用于事务管理、日志记录、性能监控等方面。 总结: - 过滤器主要用于在Servlet规范对请求进行拦截和处理。 - 拦截器主要用于在Spring MVC对请求进行拦截和处理。 - AOP主要用于将与业务逻辑无关的横切关注点进行解耦和管理。 希望以上解释能对你有所帮助!如果有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值