Spring中过滤器(Filter)和拦截器(Interceptor)的区别和联系

在我们日常的开发中,我们经常会用到Filter和Interceptor。有时同一个功能。Filter可以做,Interceptor也可以做。有时就需要考虑使用哪一个比较好。这篇文章主要介绍一下,二者的区别和联系。希望给大家进行选择的时候,提供一些帮助

Filter 和 Interceptor 的区别

Filter

过滤器(Filter)是在请求进入Tomcat容器之后,请求进入Servlet之前执行。Filter是Servlet规范规定的,只能用于web程序中。

Interceptor

拦截器(Interceptor)是在Servlet和Controller控制器之间执行。Interceptor是SpringframeWork中规定的。

Spring中过滤器(Filter)和拦截器(Interceptor)的区别和联系
  • Interceptor是基于java的反射机制的,而Filter是基于函数回调。
  • Interceptor不依赖与servlet容器,Filter依赖与servlet容器。
  • Interceptor只能对action请求起作用,而Filter则可以对几乎所有的请求起作用。
  • Interceptor可以访问action上下文、值栈里的对象,而Filter不能访问。
  • Interceptor以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。拦截器可以获取ioc中的service bean实现业务逻辑。
Spring MVC中每个控制器中可以定义多个请求处理方法,我们把这种请求处理方法简称为Action

Filter的实现

自己的 filter需要要实现 javax.servlet.Filter.

import javax.servlet.*;
import java.io.IOException;

public class Myfilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("Myfilter init");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("Myfilter doFilter before");
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("Myfilter doFilter after");
    }

    @Override
    public void destroy() {
        System.out.println("Myfilter destroy");
    }
}

注册Filter在web.xml中


        myfilter
        com.hardy.config.Myfilter

        myfilter
        /*

Interceptor的实现

自己的 Interceptor需要要实现 org.springframework.web.servlet.HandlerInterceptor.

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 在拦截点(Controller方法处理之前)执行拦截 若返回的是false则中断执行 反之亦然
        System.out.println("MyInterceptor preHandle");
        return HandlerInterceptor.super.preHandle(request, response, handler);
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 在处理过程中(Controller方法处理完之后  DispatcherServlet进行视图的渲染之前)执行拦截
        System.out.println("MyInterceptor postHandle");
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 在DispatcherServlet进行视图的渲染后 返回前进行拦截
        System.out.println("MyInterceptor afterCompletion");
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}

注册Interceptor在spring的配置文件中(application.xml)


Original: https://www.cnblogs.com/hardyzhou/p/16830294.html
Author: hardyzhou
Title: Spring中过滤器(Filter)和拦截器(Interceptor)的区别和联系

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/800059/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球