Filter过滤器和SpringMVC拦截器

本文详细介绍了Filter和Interceptor在Web应用程序中的使用方法。Filter用于拦截所有请求,并在请求前后进行处理;而Interceptor则针对经过前端控制器的请求,在具体的controller前后进行处理。文章还提供了配置示例及二者之间的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Filter使用方法

//定义一个自己的过滤器,实现Filter接口
public class MyFilter implements Filter{

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        //在请求之前进行过滤
        System.out.println("before");
        //返回过滤器链,继续通过下一个过滤器
        //如果此处不想继续执行,可以直接return,不用继续doFilter
        chain.doFilter(req, res);
        //请求结束之后
        System.out.println("after");
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub

    }

}

<!-- web.xml配置文件,配置filter和filter-mapping,name要对应 -->
<!-- 可以配置多个filter-mapping,只需要name与filter对应即可 -->
<filter>
    <filter-name>MyFilter</filter-name>
    <filter-class>filter.MyFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>MyFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

结果这里写图片描述

SpringMvc拦截器使用方法

//实现HandlerInterceptor,需要实现三个方法
//也可以继承HandlerInterceptorAdapter,preHandle默认返回true
//根据需要重写自己的方法
public class MyInterceptor implements HandlerInterceptor{

    @Override
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {
        System.out.println("视图渲染后");
        // TODO Auto-generated method stub

    }

    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
            throws Exception {
        System.out.println("请求处理后,视图渲染前");
        // TODO Auto-generated method stub

    }

    @Override
    public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object arg2) throws Exception {
        System.out.println("请求处理前");
        return true;
        }
    }

配置文件的配置
<mvc:interceptors>
        <mvc:interceptor>
            <!-- 拦截路径,这里表示拦截所有 -->
            <mvc:mapping path="/**" />
            <bean class="cn.edu.hbue.soft.interceptor.MyInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

结果这里写图片描述

以下引用https://www.cnblogs.com/panxuejun/p/7715917.html

这里写图片描述
这里写图片描述

Filter可以拦截所有请求,在请求前后进行处理
Interceptor只能拦截经过前端控制器的请求,在具体的controller前后进行处理,只要一个pre返回true了,直接到after

Filter基于回调,Interceptor基于反射

这里写图片描述
这就是基于回调,这里的Code1和Code2实际上就是自己写的拦截器的doFilter
Chain.doFilter调用MyFitler.doFilter,然后MyFilter.doFilter反过来又调用Chain.doFilter
在这个过程中执行了service方法

### Spring MVC拦截器过滤器的区别及使用场景 #### 一、所属框架与层次 Spring MVC拦截器属于Spring框架的一部分,主要用于处理Web层逻辑中的请求响应。它运行在DispatcherServlet之后,因此可以访问到更多的Spring上下文信息[^1]。 相比之下,Servlet过滤器是一个独立于具体框架的标准Java EE组件,适用于任何基于Servlet的应用程序。它的主要职责是在请求到达目标资源之前对其进行预处理,在响应返回客户端之前进行后处理。 --- #### 二、功能粒度差异 过滤器的功能较为单一,仅能操作HTTP请求响应对象,无法深入到业务方法内部。而Spring MVC拦截器则更为灵活,可以在控制器方法执行前、视图渲染完成后以及发生异常时介入处理[^2]。这种细粒度控制使得拦截器更适合复杂的业务需求。 --- #### 三、配置方式对比 ##### **过滤器** 通过`web.xml`或者注解形式注册Filter类来完成初始化工作。例如: ```xml <filter> <filter-name>myFilter</filter-name> <filter-class>com.example.MyFilter</filter-class> </filter> <filter-mapping> <filter-name>myFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` 上述XML片段展示了如何指定一个全局生效的过滤器实例[^3]。 ##### **拦截器** 需借助Spring配置文件或Java Config模式声明对应的Interceptor Bean并绑定至特定路径上。下面是一段典型的Java代码示例展示如何创建自定义拦截器: ```java public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("Pre Handle method is called"); return true; // 如果返回false,则终止后续流程 } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("Post Handle method is called"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("After Completion callback method is invoked"); } } ``` 接着将其加入到拦截链中: ```java @Configuration public class WebConfig extends WebMvcConfigurerAdapter { @Bean public MyInterceptor myInterceptor() { return new MyInterceptor(); } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(myInterceptor()).addPathPatterns("/api/**"); // 只针对/api开头的URL应用此拦截器 } } ``` 以上实现了对部分API接口的安全校验或其他前置条件验证等功能[^4]。 --- #### 四、执行顺序说明 当存在多个拦截器组成链条结构时,遵循先进先出原则依次调用各自的preHandle方法;而在afterCompletion阶段则是逆序触发回调函数[^5]。这有助于开发者合理安排各环节的任务分配。 --- ### 总结 综上所述,虽然二者都能起到类似的作用——即围绕着HTTP交互过程附加额外行为,但由于定位不同决定了其适用范围有所侧重。对于简单的跨域设置或是日志记录等工作推荐采用轻量级的Filter方案即可满足需求;而对于那些紧密关联业务规则的操作建议优先考虑利用强大的Spring Interceptor机制加以实现。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值