SpringBoot之Filter和Interceptor

SpringBoot之Filter和Interceptor

Filter

1.定义

Filter依赖于Servlet容器,属于Servlet规范的一部分它可以对客户端与资源之间的请求与响应的信息进行过滤以及处理。

2.执行流程

当Web容器接收到一个对资源的请求时,它会根据过滤器的过滤规则判断是否有过滤器跟该资源有关,如果存在有关的过滤器,那么容器就会将该请求交给过滤器进行处理,在过滤中可以对请求的内容的进行处理,例如设置编码信息、设置属性等,然后再将请求发给被请求的资源。同样当被请求的资源对请求做出响应的时候,web容器会回调过滤器的方法,对响应进行处理。

3.生命周期

在应用启动时,调用Filter的init()方法(该方法只在应用启动时被调用),应用关闭时调用Filter的destroy()方法(该方法只有在应用关闭被调用),Filter的doFilter()方法是在请求符合过滤器的过滤规则时被调用

public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("====================init()方法只在程序启动时被调用====================");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        // 对请求进行放行
        filterChain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        System.out.println("====================destroy()只在程序关闭时被调用====================");
    }
}

Interceptor

1.定义

SpringMVC中的拦截器(Interceptor)可以对每一个请求处理前后进行相关的业务处理,基于Java的反射机制,类似于Servlet的Filter(基于函数回调)

2.执行流程

SpringBoot之Filter和Interceptor_第1张图片

3.相关的代码实现

1.实现自己的拦截器

@Component
public class MyInterceptor extends HandlerInterceptorAdapter {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("====================在请求被执行前执行(拦截器)====================");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("====================在handler处理了请求之后执行,但是需要preHandle方法返回true的时候才会执行(拦截器 )====================");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("====================在DispatcherServlet处理请求后执行(拦截器)");
        super.afterCompletion(request, response, handler, ex);
    }

    public MyInterceptor() {
    }

}

2.注册拦截器

@SpringBootApplication
public class MyApplication implements WebMvcConfigurer {

    /**
     * 这里不建议直接继承WebMvcConfigurationSupport,因为继承该类会导致SpringBoot的自动配置失效,所以最好的方法是实现WebMvcConfigurer接口
     */

    @Resource
    private MyInterceptor myInterceptor;

    public static void main(String[] args) {
        SpringApplication.run(MyBlogApplication.class, args);
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor).addPathPatterns("/**");
    }
}

过滤器与拦截器的区别

  • Filter依赖于Servlet容器,Interceptor不需要
  • Filter是基于函数回调,Interceptor是基于Java反射实现
  • Filter几乎可以处理所有的请求,Interceptor只能处理Controller的请求

你可能感兴趣的:(java,java,interceptor,filter)