Filter 和 Interceptor区别

Filter和Interceptor的对比 问题引入 在开发过程中需要对某些接口进行鉴权,一开始的想法是写个Filter,然后拦截指定的路径,通过获取header中的信息进行鉴权,没有权限则抛出自定义异常,然后自定义全局异常处理器再去拦截。 程序测试时发现,没权限时确实被拦截了,但是并没有进入到全局异常处理器,而是直接抛出500。通过查找发现,Filter的在进入Servlet之前进行拦截的,而全局异常是SpringBoot中的(本质是Servlet),所以全局异常处理并不能拦截到Filter抛出的异常。 基本概念 与这个相关的一些概念如下: 1、 阅读详情

Filter和Interceptor的联系和区别 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/456610808?utm_source=wechat_session&utm_medium=social&utm_oi=1197944133762072576&utm_campaign=shareopn

《Filter简述和@Filter注解使用》主要对过滤器Filter进行了简单的说明,本文将对拦截器Interceptor进行简单讲解,并通过几个例子对它们的差异进行简要分析。

目录

拦截器Interceptor简介

自定义拦截器Interceptor

注册自定义拦截器Interceptor

过滤器Filter和拦截器Interceptor区别

过滤器和拦截器如何注入依赖服务

过滤器和拦截器如何指定加载顺序

过滤器Filter和拦截器Interceptor使用场景

拓展Servlet和Controller的区别是什么?


拦截器Interceptor简介

一个应用中可以定义多个拦截器,spring在项目启动时,会将这些拦截器注册进来,并按照默认规则进行排序。如果是自定义的拦截器,可手动设置拦截器调用的先后顺序。

各拦截器是链式调用,一个请求可以触发多个拦截器,每个拦截器的调用会按照它加载到spring中的顺序依次执行。

拦截器中有3个方法,功能如下:

(1)preHandle:该方法在调用Controller方法或获取静态资源前被调用(静态资源包括html、js等)。

(2)postHandle:该方法在调用Controller方法或获取静态资源后,但是视图还没有被渲染前调用。

(3)afterCompletion:该方法在视图渲染后进行调用,主要用来清除资源。

自定义拦截器Interceptor

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("调用preHandle");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("调用postHandle");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("调用afterCompletion");
    }
}

注册自定义拦截器Interceptor

编写配置类并实现WebMvcConfigurer接口。

@Configuration
public class MyWebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
    }
}

过滤器Filter和拦截器Interceptor区别

过滤器和拦截器都可以实现例如编码设置、日志记录、权限控制等功能,但是二者还是有很多区别的。

(1)实现原理不同

  • Filter是基于函数回调实现的:

每个自定义过滤器都会实现一个doFilter()方法,这个方法有一个关键参数FilterChain。它是一个回调接口,ApplicationFilterChain是它的具体实现类,该类内部也有一个doFilter()方法,这个方法就是回调方法(ps:可以理解为方法递归调用,查看源码比较容易理解)。

假设有2个滤器,调用流程图如下(ps:画的比较抽象):

两个过滤器执行流程

  • Interceptor是基于反射实现的:

为什么说拦截器是基于反射实现的呢?个人理解在拦截器内部的三个方法中,都有一个共同的参数handler,这个参数里包含的信息比较丰富。包含该请求所对应的方法、方法所在的Controller、方法参数等信息,而这些信息都是spring通过反射加载进来的。正是由于这些丰富的参数,使得拦截的功能相比过滤器功能更强大。

handler参数信息

(2)使用范围不同

过滤器Filter实现了javax.servlet.Filter接口,也就是说过滤器的使用要依赖于Tomcat等容器,所以它只能在web程序中使用。

拦截器Interceptor实现了org.springframework.web.servlet接口,它是由Spring容器进行管理,并不依赖Tomcat等容器,既可以应用在web程序中,也可以应用在非web程序中。

(3)触发时机不同

过滤器Filter是在请求进入Tomcat等容器后,servlet处理之前进行调用的。

拦截器Interceptor是在请求进入servlet后,执行Controller之前进行调用的。

(4)拦截范围不同

过滤器Filter几乎可以拦截所有进入容器的请求。

拦截器Interceptor只会对Controller请求或访问static目录下的静态资源请求起作用。

(5)初始化时机不同

过滤器Filter是随着Tomcat等web容器启动时而进行初始化。

拦截器Interceptor时随着spring启动而进行初始化。

过滤器和拦截器如何注入依赖服务

在实际开发中,当使用到过滤器或拦截器时,难免会引入一些依赖的service服务。下面就通过例子进行简要说明:

Filter依赖service:直接采用注解@Autowired即可。

@WebFilter(urlPatterns = {"/user/*"})
@Log4j2
public class MyFilter implements Filter {
    @Autowired
    private UserService userService;
    
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        log.info("Filter获取到请求地址:" + httpServletRequest.getServletPath());
        filterChain.doFilter(request, response);

        HttpServletResponse httpServletResponse = (HttpServletResponse) response;
        log.info("Filter获取到响应类型:" + httpServletResponse.getContentType());
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("Filter随着项目的启动而启动,只初始化一次");
    }

    @Override
    public void destroy() {
        System.out.println("Filter随着web项目的停止而销毁,完成资源回收");
    }
}

Interceptor依赖service:直接采用注解@Autowired,但是在将拦截器注入到spring容器中时,不能自己通过new来进行创建。需要将拦截器当做一个普通的bean注入到spring容器中,这样就可以将service注入到拦截器中。

public class MyInterceptor implements HandlerInterceptor {
    @Autowired
    private UserService userService;
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("调用preHandle");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("调用postHandle");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("调用afterCompletion");
    }
}

@Configuration
public class MyWebConfig implements WebMvcConfigurer {

    @Bean
    public MyInterceptor getMyInterceptor(){
        return new MyInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // getMyInterceptor()这种注册方式可以在拦截器里注入bean
        registry.addInterceptor(getMyInterceptor()).addPathPatterns("/**");
        // 这种注册方式由于是自己new出来的,所以在拦截器里注册的bean都为null
        registry.addInterceptor(new MyInterceptor2()).addPathPatterns("/**");
    }
}

过滤器和拦截器如何指定加载顺序

(1)Filter:需要通过配置类指定加载顺序,值越小,越先执行。采用@WebFilter无法指定顺序。

@Bean
public FilterRegistrationBean myFilter(){
    MyFilter myFilter = new MyFilter();
    FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(myFilter);
    filterRegistrationBean.setUrlPatterns(Arrays.asList("/user/*"));
    filterRegistrationBean.setOrder(2);
    return filterRegistrationBean;
}

(2)Interceptor:需要通过配置类指定加载顺序,值越小,越先执行。

@Configuration
public class MyWebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // getMyInterceptor()这种注册方式可以在拦截器里注入bean
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").order(1);
        // 这种注册方式由于是自己new出来的,所以在拦截器里注册的bean都为null
        registry.addInterceptor(new MyInterceptor2()).addPathPatterns("/**").order(2);
    }
}

过滤器Filter和拦截器Interceptor使用场景

二者相比拦截器功能更强大些,Filter能做的事情,它都能做,而且可以在请求前,请求后执行,比较灵活。Filter主要用来设置字符编码、过滤敏感词汇和URL级别的简单权限控制。如果需要记录比较详细的信息或比较复杂的权限管理,还是建议用拦截器实现。

拓展Servlet和Controller的区别是什么?

使用Servlet可以收集来自网页表单的用户输入,还可以动态创建网页。DispatcherServlet是SpringMVC中唯一的Servlet,Servlet容器(Tomcat)把所有的请求都转发到DispatcherServlet,然后通过HandlerMapping把请求路由到具体的Controller中。因此,Controller只是一个普通的Java Bean

STM32F405实战:手把手教你实现永磁同步电机无感FOC控制(附完整工程文件) 本文详细介绍了基于STM32F405微控制器实现永磁同步电机无感FOC控制的完整实战方案。文章从硬件搭建、CubeMX配置入手,逐步讲解了FOC核心算法、SVPWM调制,并重点阐述了如何结合HFI高频方波注入与滑模观测器(SMO)实现全速域无感控制。内容涵盖算法原理、代码实现、参数整定及调试技巧,并附有完整工程文件,为开发者提供从理论到实践的全面指导。 阅读详情

相关推荐

使用RepeatModeler和RepeatMasker注释基因组重复序列

重复序列注释有两种常用策略,基于同源序列相似性和基于重复序列结构特征。RepeatMasker是基于同源序列相似性注释序列的常用工具, RepeatModeler可用来从头对基因组的重复序列家族进行建模注释,它的核心组件是RECON和RepatScout。 这篇教程介绍如何使用RepeatModeler从头鉴定基因组的重复序列,之后用RepeatMasker根据自...

xuzhougeng blog 8852

Interceptor和Filter区别

3、触发时机不同:Filter:请求进入容器后,进入servlet之前执行,servlet处理完后结束;5、控制执行顺序不同:Filter用@Order控制执行顺序,通过@Order控制过滤器的级别,值越小级别越高越先执行。Interceptor是spring的,可以独立使用,不仅能应用在web程序中,也可以用于Application、Swing等程序中。6、注入bean情况不同:这是因为加载顺序导致的问题,拦截器加载的时间点在springcontext之前,而Bean又是由spring进行管理。...

Z_BK9的博客 4022

使用MKL+Eigen求解稀疏矩阵方程组

问题:求解Ax=b的解,其中,A为大型稀疏矩阵,长和宽分别为1500^2。 一般思路: (1)A为对称正定矩阵,对A使用cholesky分解。 (2)A为对称不定矩阵,使用LDL‘分解,即: PAP'=LDL' 其中,L为单位下三角矩阵,D由阶数为1或者2的对角块构成,P是置换矩阵。 (3)不对称矩阵:LU分解。 (4)长方形矩阵(长...

薛晓伟 3445

Filter和Interceptor的联系和区别

前文《Filter简述和@Filter注解使用》主要对过滤器Filter进行了简单的说明,本文将对拦截器Interceptor进行简单讲解,并通过几个例子对它们的差异进行简要分析。 拦截器Interceptor简介 一个应用中可以定义多个拦截器,spring在项目启动时,会将这些拦截器注册进来,并按照默认规则进行排序。如果是自定义的拦截器,可手动设置拦截器调用的先后顺序。 各拦截器是链式调用,一个请求可以触发多个拦截器,每个拦截器的调用会按照它加载到spring中的顺序依次执行。 拦截器中有3个方法

m0_53288098的博客 560

华为海思IC笔试通关秘籍:物理/电路/工艺三大方向高频考点解析(附真题)

本文深度解析华为海思IC笔试中物理设计、电路设计和工艺制造三大方向的高频考点与备考策略。针对华为海思IC笔试机考的特点,提供了方向选择建议、核心知识梳理及真题实战技巧,帮助考生构建系统性复习框架,高效备战,提升通关成功率。

mars5的博客 1309

SMETANA 安装使用教程

关于SMETANA的安装和简单使用信息

qq_44940977的博客 1169

过滤器(Filter)与拦截器(Interceptor)区别

过滤器(Filter)与拦截器(Interceptor)区别

吴名氏的博客 13万+

手把手教你学Simulink——基于Simulink的隔离型DC-DC全桥变换器移相控制建模示例

本文详细介绍了基于Simulink的全桥移相变换器(PSFB)建模与控制方法。首先分析了全桥移相拓扑在大功率应用中的优势,包括ZVS实现、高频化和小型化特点。随后给出了具体设计参数和移相控制策略,采用电压外环+移相角内环的双闭环控制架构。文章重点演示了Simulink建模步骤,包括主电路搭建、移相PWM生成和PI控制器设计,并通过满载稳态、负载阶跃和轻载测试三种场景验证了系统性能。最后总结了工程实践要点,提出自适应控制等扩展方向,强调移相控制通过精准时间管理实现高效能量转换的核心价值。

MHD0815的博客 261

过滤器(filter)和拦截器(Interceptor)的区别以及使用场景

过滤器实现的是 javax.servlet.Filter 接口,而这个接口是在Servlet规范中定义的,也就是说过滤器Filter 的使用要依赖于Tomcat等容器,导致它只能在web程序中使用。拦截器 Interceptor 是在请求进入servlet后,在进入Controller之前进行预处理的,Controller 中渲染了对应的视图之后请求结束。过滤器和拦截器 底层实现方式不相同,过滤器是基于函数回调的,拦截器则是基于Java的反射机制(动态代理)实现的。过滤器 和 拦截器的触发时机不同。

qq_43869106的博客 5736

详解舵机的基本原理以及控制方法

文章目录什么是舵机?伺服控制硬件连接舵机规格SG90MG90SMG996R总结 什么是舵机? 舵机是伺服电机的一种,伺服电机就是带有反馈环节的电机,我们可以通过伺服电机进行精确的位置控制或者输出较高的扭矩; 舵机也叫也叫 RC 伺服器,通常用于机器人项目,也可以在遥控汽车,飞机等航模中找到它们。 类似舵机这样的伺服系统通常由小型电动机,电位计,嵌入式控制系统和变速箱组成。 电机输出轴的位置由内部电位计不断采样测量,并与微控制器(例如STM32,Arduino)设置的目标位置进行比较; 根据相应的偏差,控制

一名热爱技术的工程师的博客。分享技术干货,记录美好生活。永远相信美好的事情即将发生。 4万+

化工热力学软件:Aspen Plus二次开发_(9).过程控制与动态模拟v1

Aspen Plus 提供了丰富的过程控制工具和方法,可以用于静态和动态过程的模拟和控制策略的开发。通过控制回路设计、动态模拟、优化工具和数据交换接口,用户可以设计和优化各种复杂的控制策略,提高化工生产的稳定性和效率。此外,结合外部软件(如MATLAB、Simulink、LabVIEW等),可以实现更高级的控制策略,如自适应控制和模型预测控制,进一步提升过程控制的精度和灵活性。希望本文的内容能帮助用户更好地理解和应用Aspen Plus中的过程控制功能。

kkchenjj的博客 405

Interceptor的用法以及和Filter的区别

1 拦截器接口 SpringMVC的拦截器Interceptor类似于Javaweb的Filter过滤器 //拦截器就是是一个实现接口HandlerInterceptor的类 public interface HandlerInterceptor { //在目标方法调用前执行,true是表示放行方法(chain.doFilter()),false表示不放行 default boolean preHandle(HttpServletRequest request, HttpServletRe

wwwwwww31311的博客 2253

【PyTorch】CNN(一维卷积Conv1D)实现时间序列预测

本文介绍了一维卷积神经网络(Conv1D)在时间序列预测中的应用,展示了其基本原理及实现方式。通过合适的数据预处理和模型调参,Conv1D可以有效地捕捉时间序列数据中的模式,从而进行精准预测。

走向CTO的路上... 1173

Filter与Interceptor的区别

就如我们开始说的jwt的问题,在执行操作之前会先要验证用户的登录信息,这个就可以在这个方法中实现,如果验证成功则返回 true,继续执行数据操作业务;在看springboot项目时,其中的会话持续时,了解到token,session,jwt等方法,但是接着我就了解到过滤器(Filter)以及拦截器(Interceptor),感觉这两个东西真的有够像的了,也是去看了好多篇文章。过滤器(Filter) :可以拿到原始的http请求,但是拿不到你请求的控制器和请求控制器中的方法的信息。

weixin_36910630的博客 51

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Filter、Interceptor、Spring Aop 区别分析

Filter、Interceptor、Spring Aop 区别

笔记 1076

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Interceptor、Filter、Servlet的区别

原文参照: https://mp.weixin.qq.com/s/cFDmHf59UAvHP9_qswbMFA https://mp.weixin.qq.com/s/QJuBUKXS-FoFBbf7N84QpA 一、关系图理解 二、过滤器(Filter)   定义:Filter依赖于servlet容器。在实现上,基于函数回调,它可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初...

优快云_KONGlX的博客 696

SpringMVC中Interceptor和Filter区别

Interceptor 主要作用:拦截用户请求,进行处理,比如判断用户登录情况,权限验证,主要针对Action请求进行处理。是通过HandlerInterceptor 实现的。 配置如下:   <mvc:interceptors> <bean class="cn.appsys.testInterceptor"></bean>//拦截所...

白驹过隙 443

filter和interceptor的区别

前言 最近在面试的时候,被问到了这个问题,觉得答得不是很好,在此进行整理和记录,供自己学习,也希望能帮助到大家。 什么是Filter 在java的javax.servlet下有一个接口Filter。任何实现了Filter接口的类都可以称之为filter。Filter的主要用途是设置字符集、控制权限、控制转向等等。在使用filter的过程中,如果是传统的web项目,带有web.xml文件这...

经典鸡翅 1251

Filter和Interceptor的区别

Filter和Interceptor的区别 Interceptor 主要作用: 拦截用户请求,进行处理,比如判断用户登录情况、权限验证,只要针对Controller请求进行处理,是通过HandlerInterceptor。 Interceptor分两种情况,一种是对会话的拦截,实现spring的HandlerInterceptor接口并注册到mvc的拦截队列中,其中preHandle()方法在调用Handler之前进行拦截(上图步骤3),postHandle()方法在视图渲染之前调用(上图步骤5),aft

qq_44918331的博客 1222

必会系列之 filter 和 interceptor 的区别

什么是Filter 在java的javax.servlet下有一个接口Filter。任何实现了Filter接口的类都可以称之为filter。Filter的主要用途是设置字符集、控制权限、控制转向等等。在使用filter的过程中,如果是传统的web项目,带有web.xml文件这种。我们需要在xml里面进行配置。比如下面这样。 <filter> <description>字符集过滤器</description> <filter-n

经典鸡翅 775
上一篇: 【机器学习】pd.get_dummies()
下一篇: 几种常见web 容器
洋气月
博客等级 码龄8年 5386粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洋气月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值