《面试必考》 — 微服务调用(OpenFeign)、过滤器(Filter)和拦截器(Interceptor)的区别
在Java和Spring框架中,过滤器(Filter)和拦截器(Interceptor)都是用于处理HTTP请求的组件,但它们有明显的区别:
openFeign中过滤器写在文章最后,请各位道友移步观看
工作原理:
过滤器:基于函数回调,实现了javax.servlet.Filter接口,通常在doFilter()方法中编写过滤逻辑。它们是Servlet规范的一部分,适用于任何遵循Servlet规范的应用服务器。
拦截器:基于Java的反射机制,Spring MVC中的拦截器是基于AOP(面向切面编程)思想实现的,使用代理模式来拦截请求。
依赖性:
过滤器:依赖于Servlet容器(如Tomcat、Jetty等)来运行,因为它们是Servlet规范的一部分。
拦截器:不直接依赖于Servlet容器,而是Spring框架的组成部分,因此只有在使用Spring MVC时才涉及拦截器。
作用范围:
过滤器:可以应用于几乎所有的HTTP请求,包括静态资源、JSP、Servlet等。
拦截器:主要针对Controller层,即Spring MVC中的请求映射,通常只对.action或指定的URL模式起作用。
访问范围:
过滤器:无法访问到Spring MVC的模型视图(ModelAndView)、请求上下文等,只能操作ServletRequest和ServletResponse对象。
拦截器:可以访问到更多的信息,如Action上下文、值栈、模型数据等,提供了更丰富的信息处理能力。
调用时机和次数:
过滤器:在容器初始化时被调用一次,并且可以设置多个过滤器,形成过滤链,每个请求都会经过这些过滤链。
拦截器:在请求处理前后被调用,可以多次被调用,形成拦截器链,每次请求可以触发多个拦截器,并按照声明顺序执行。
应用场景:
过滤器:常用于字符编码转换、登录验证、安全控制、性能监控、GZIP压缩等全局性的处理。
拦截器:主要用于日志记录、权限控制、事务管理、性能统计等与业务逻辑相关的处理。
最后:在openFeign中,相信路由、断言、过滤器大家都不陌生吧!断言是判断这个请求是否符合某一种规则,而过滤器则是按照请求过滤掉一下东西,可以使用自定义过滤器对某一类接口进行接口耗时统计。OpenFeign的过滤器是基于Feign的拦截器机制实现的,可以通过实现feign.Client接口或者使用@FeignClient上的@RequestInterceptor注解来定义。
断言(Assertion)是在请求结果返回后对结果进行校验的机制,通过判断返回结果是否符合预期,来确定本次请求是否成功。在OpenFeign中,可以通过实现ResponseHandler接口来自定义断言逻辑,当请求结果返回后,会执行该接口中的方法进行结果校验。
过滤器(Filter)则是在请求发出前或者请求结果返回后,对请求进行拦截和处理的机制。在OpenFeign中,可以通过实现RequestInterceptor接口来自定义过滤器逻辑。该接口包含两个方法,分别在请求发出前和请求结果返回后执行。
因此,断言和过滤器的主要区别在于它们的作用时机和具体实现逻辑。断言主要用于对服务调用结果的检查,而过滤器则可以用于请求前和请求后的处理。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)