Interceptor和Filter

拦截器和过滤器的作用是将前端请求阻塞,只有通过了设置的逻辑后才会执行后面的代码

Interceptor是Spring框架中提供的组件,Filter是Servlet提供的组件

再Spring框架中使用Filter需要再启动类上加上@ServletComponentScan注解

  • Filter需要在web.xml中配置,依赖于Servlet;
  • Interceptor需要在SpringMVC中配置,依赖于框架

拦截器(Interceptor)是基于Java的反射机制,而过滤器(Filter)是基于函数回调

拦截器中可以注入 Spring 的 Bean,能够获取到各种需要的 Service 来处理业务逻辑,而过滤器则不行。

具体是什么

过滤器(Filter)

  1. 执行过程,请求和响应都会经过过滤器

  2. 实现,实现javax.servlet这个包下的接口,/*代表过滤所有资源

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    import javax.servlet.*;
    import javax.servlet.annotation.WebFilter;
    import java.io.IOException;

    //过滤的资源路径
    @WebFilter(urlPatterns = "/*")
    public class filter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    System.out.println("初始化方法");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    //放行操作
    filterChain.doFilter(servletRequest,servletResponse);

    }

    @Override
    public void destroy() {
    System.out.println("销毁方法");
    }
    }
  3. 多个过滤器之间可以形成过滤器链,可以通过注解的形式指定过滤器的执行顺序,默认按照名称的顺序先后执行,通过创建bean可以配置在Spring中的过滤器顺序,通过xml文件创建的过滤器执行顺序就是映射中配置的顺序,具体参照这篇博客

拦截器(Interceptor)

  1. 执行过程,只会拦截Spring框架中的资源

  2. 创建拦截器,实现HandlerInterceptor接口,/**代表所有路径,/*只代表一级路径

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    package com.sky.interceptor;
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;

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

    public class Dome implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    System.out.println("目标资源执行前进入的方法");
    //true代表放行
    return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    System.out.println("目标资源执行后进入的方法");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    System.out.println("视图渲染完毕进入的方法");


    }
    }

  3. 注册拦截器,注册顺序即为执行顺序

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    @Component//自动注册为Spring的一个Bean,自动检测并注册这个配置类
    public class WebMvcConfig implements WebMvcConfigurer {

    @Autowired
    private TestInterceptor1 testInterceptor1;

    @Autowired
    private TestInterceptor2 testInterceptor2;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(testInterceptor1)
    .excludePathPatterns("/**/*.css", "/**/*.js", "/**/*.png", "/**/*.jpg", "/**/*.jpeg")
    .addPathPatterns("/hello");

    registry.addInterceptor(testInterceptor2).addPathPatterns("/hello");
    }

    }