SpringMVC拦截器和过滤器的区别

本文详细解析了Java Web开发中拦截器与过滤器的区别,包括它们的工作原理、触发时机及使用场景。拦截器基于反射机制,能访问action上下文,而过滤器依赖于servlet容器,对几乎所有请求有效。

【基础篇】

过滤器和拦截器的区别:

①拦截器是基于java的反射机制的,而过滤器是基于函数回调。   
②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。

拦截器可以获取ioc中的service bean实现业务逻辑,拦截器可以获取ioc中的service bean实现业务逻辑,拦截器可以获取ioc中的service bean实现业务逻辑,

触发时机:

1.过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。
2.过滤器的触发时机是容器后,servlet之前,所以过滤器的doFilter(
ServletRequest request, ServletResponse response, FilterChain chain
)的入参是ServletRequest ,而不是httpservletrequest。因为过滤器是在httpservlet之前。

在这里插入图片描述

总结:过滤器包裹住servlet,servlet包裹住拦截器。

过滤器:

@Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("before...");
        chain.doFilter(request, response);
        System.out.println("after...");
    }
    

1、chain.doFilter(request, response);这个方法的调用作为分水岭。事实上调用Servlet的doService()方法是在chain.doFilter(request, response);这个方法中进行的。
2、过滤器是JavaEE标准,采用函数回调的方式进行。是在请求进入容器之后,还未进入Servlet之前进行预处理,并且在请求结束返回给前端这之间进行后期处理。

拦截器


    //preHandle()这个方法是在过滤器的chain.doFilter(request, response)方法的前一步执行,也就是在 [System.out.println("before...")][chain.doFilter(request, response)]之间执行。
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle");
        return true;
    }
	
	//preHandle()方法之后,在return ModelAndView之前进行,可以操控Controller的ModelAndView内容。
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle");
    }


	//afterCompletion()方法是在过滤器返回给前端前一步执行,也就是在[chain.doFilter(request, response)][System.out.println("after...")]之间执行。
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion");
    }

1、拦截器是被包裹在过滤器之中的。
2、拦截器是spring容器的,是spring支持的
3、SpringMVC的机制是由同一个Servlet来分发请求给不同的Controller,其实这一步是在Servlet的service()方法中执行的。

在这里插入图片描述

在这里插入图片描述

无意中刷到的博客,感觉不错记录一下,点击此处查看原文

### Spring MVC 中拦截器过滤器区别 #### 定义与功能范围 - **过滤器 (Filter)** 是 Servlet 规范的一部分,因此其适用范围更广。任何进入 Web 应用程序的 HTTP 请求都会经过 Filter 处理[^1]。这意味着无论请求的目标是否为 Spring MVC 控制器,只要配置了相应的 URL 模式匹配,则会触发 Filter 执行逻辑。 - **拦截器 (Interceptor)** 属于 Spring MVC 特有的机制,专注于对框架内部管理下的控制器方法调用实施控制[^2]。只有当请求被 DispatcherServlet 路由至某个具体的 Controller 方法时才会激活 Interceptor。 #### 工作时机差异 - 过滤器会在整个应用程序接收到客户端发出的数据包之后立即生效,在到达目标资源之前先行介入并作出初步判断或修改响应内容;如果允许继续前进则交给后续环节处理,反之可以直接终止流程返回错误信息给前端用户。 - 拦截器位于更为深入的一层——即在已经确认是由 Spring MVC 来负责解析当前路径所指向的具体业务逻辑单元的前提下才发挥作用。此时不仅可以获取更多关于上下文环境的信息(如 Session),还能针对特定类型的事务场景定制化前置/后置动作序列[^3]。 #### 配置方式不同 对于 Java EE 平台上的标准组件来说,Filters 可以通过 web.xml 文件声明式注册或者借助 @WebFilter 注解实现编程式的动态加载。相比之下,Interceptors 则依赖 spring-mvc 或者 application.properties/yml 下的相关属性来指定,并且通常需要配合 HandlerMapping 接口完成链路组装工作。 ```xml <!-- Example of configuring a filter in web.xml --> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` ```java // Example of registering an interceptor programmatically within Spring configuration class @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyCustomInterceptor()) .addPathPatterns("/api/**"); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值