applicationContext.xml  对比 spring-servlet.xml

参考:https://www.baeldung.com/spring-applicationcontext-vs-spring-servlet-xml


一、过滤器 vs 拦截器

  Filter的执行由Servlet容器回调完成, 而拦截器通常通过动态代理的方式来执行。

拦截器则可以通过IoC容器来管理,因此可以通过注入等方式来获取其他Bean的实例,因此使用会更方便。

  过滤器 实现的是 javax.servlet.Filter 接口,而这个接口是在Servlet规范中定义的,也就是说过滤器Filter 的使用要依赖于Tomcat等容器,导致它只能在web程序中使用。

  拦截器(Interceptor) 它是一个Spring组件,并由Spring容器管理,并不依赖Tomcat等容器,是可以单独使用的

  过滤器Filter是在请求进入容器后,但在进入servlet之前进行预处理,请求结束是在servlet处理完以后。

  拦截器 Interceptor 是在请求进入servlet后,在进入Controller之前进行预处理的,Controller 中渲染了对应的视图之后请求结束。

    

java spring 过滤器 spring 的过滤器_spring

二、应用场景对比

  过滤器应用场景

  • 过滤敏感词汇(防止sql注入)
  • 设置字符编码
  • URL级别的权限访问控制
  • 压缩响应信息

  拦截器应用场景:拦截器本质上是面向切面编程(AOP),符合横切关注点的功能都可以放在拦截器中来实现,主要的应用场景包括:

  • 登录验证,判断用户是否登录。
  • 权限验证,判断用户是否有权限访问资源,如校验token
  • 日志记录,记录请求操作日志(用户ip,访问时间等),以便统计请求访问量。
  • 处理cookie、本地化、国际化、主题等。
  • 性能监控,监控请求处理时长等。
  • 通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现)

  

java spring 过滤器 spring 的过滤器_应用场景_02


三、 定制Filter

  参考:https://www.techiedelight.com/zh/how-to-define-custom-filters-spring-boot-application/

  • 方法1:注册成Component,被spring识别到

   限制:上述过滤器适用于所有请求

      

java spring 过滤器 spring 的过滤器_拦截器_03

或 扩展

java spring 过滤器 spring 的过滤器_应用场景_04

  • 方法2:注册一个FilterRegistrationBean(SpringBoot)类型的@Bean: 可指定影响的URL

      

java spring 过滤器 spring 的过滤器_spring_05

       

java spring 过滤器 spring 的过滤器_应用场景_06

  •  方法3:使用Servlet的@WebFilter注解

            

java spring 过滤器 spring 的过滤器_java spring 过滤器_07


 四、定制拦截器:基于WebMvcConfigurer接口

   参考spring-web.pdf,如下均可以定制;参考:https://blog.csdn.net/pan_junbiao/article/details/120039885

  

java spring 过滤器 spring 的过滤器_java spring 过滤器_08

  官方推荐直接实现 WebMvcConfigurer(Spring定义,推荐) 或者直接继承 WebMvcConfigurationSupport    //  WebMvcConfigurerAdapter被标记为 @Deprecated

  步骤1、自定义拦截器

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        System.out.println("=============MyInterceptor:preHandle=============");
        System.out.println("MyInterceptor: get(key)=" + request.getAttribute("key"));
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
        ModelAndView modelAndView) {
        System.out.println("=============MyInterceptor::postHandle=============");
    }
}

直接实现 WebMvcConfigurer

  

java spring 过滤器 spring 的过滤器_拦截器_09


四、HandlerInterceptor VS ClientHttpRequestInterceptor

用于web请求拦截

        接收请求时拦截,实现WebMvcConfigurer,

    spring-webmvc项目,org.springframework.web.servlet.HandlerInterceptor    HandlerInterceptor拦截的http请求是来自于客户端浏览器之类的,是最常见的http请求拦截器;

用于RestTemplate的定制

      发送请求前拦截,
    spring-web项目,org.springframework.http.client.ClientHttpRequestInterceptor
    Spring提供了ClientHttpRequestInterceptor接口,可以对请求进行拦截,并在其被发送至服务端之前修改请求或是增强相应的信息。

    

java spring 过滤器 spring 的过滤器_spring_10

     

java spring 过滤器 spring 的过滤器_java spring 过滤器_11