springboot中拦截器和过滤器的区别

拦截器跟过滤器的区别

定义过滤器

@WebFilter("/*")
public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("===================过滤器前===================");
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("===================过滤器后===================");
    }

    @Override
    public void destroy() {

    }
}

定义拦截器

public class MyFirstInterceptor 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");
    }
}

运行结果:

===================过滤器前===================

---------方法后执行,在渲染之前--------------preHandle

​ 请求方法执行中...

----------方法后执行,在渲染之前--------------postHandle

--------- 在视图渲染之后--------------afterCompletion

===================过滤器后===================

过滤器Filter执行了两次,拦截器Interceptor只执行了一次。

过滤器和拦截器区别:

1、过滤器是基于函数回调的,而拦截器是基于java反射的

在我们自定义的过滤器中都会实现一个 doFilter()方法,这个方法有一个FilterChain 参数,而实际上它是一个回调接口。ApplicationFilterChain是它的实现类, 这个实现类内部也有一个 doFilter() 方法就是回调方法。

public interface FilterChain {
    void doFilter(ServletRequest var1, ServletResponse var2) throws IOException, ServletException;
}

过滤器和拦截器区别:

1、过滤器是基于函数回调的,而拦截器是基于java反射的

在我们自定义的过滤器中都会实现一个 doFilter()方法,这个方法有一个FilterChain 参数,而实际上它是一个回调接口。ApplicationFilterChain是它的实现类, 这个实现类内部也有一个 doFilter() 方法就是回调方法。

public interface FilterChain {
    void doFilter(ServletRequest var1, ServletResponse var2) throws IOException, ServletException;
}
打赏
评论区
头像