【大白话系列】-- 过滤器 && 拦截器

客户端一个请求传入到后端后的执行顺序:过滤器(处理request) -> 拦截器(处理request) -> 处理业务 -> 过滤器(处理response) -> 拦截器(处理response)

故我们首先得了解过滤器和拦截器:

过滤器配置见:configuration/FilterConfiguration

拦截器配置见:configuration/WebMvcConfigurer

 

首先明确过滤器和拦截器的不同:

 

  1. 过滤器和拦截器触发时机不一样,过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。

  2. 拦截器可以获取IOC容器中的各个bean,而过滤器就不行,因为拦截器是spring提供并管理的,spring的功能可以被拦截器使用,在拦截器里注入一个service,可以调用业务逻辑。而过滤器是JavaEE标准,只需依赖servlet api ,不需要依赖spring。

 

  1. 过滤器基本用法:

    1. 先自定义一个拦截器,写上我们自己对逻辑的处理。(以日志为例)

      public class ReqFilter implements Filter {
          public ReqFilter() {
              System.out.println("init reqFilter");
          }
      
          @Override
          public void init(FilterConfig filterConfig) throws ServletException {
          }
      
          @Override
          public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                  throws IOException, ServletException {
              HttpServletRequest req = (HttpServletRequest) request;
              log.info("url={}, params={}", req.getRequestURI(), JSON.toJSONString(req.getParameterMap()));
              chain.doFilter(req, response);
          }
      
          @Override
          public void destroy() {
          }
      }

      实现一个自定义的Filter容易,一般有两个步骤

      1. 实现 Filter 接口

      2. 在doFilter方法中添加业务逻辑,如果允许访问继续,则执行chain.doFilter(req, response);; 不执行上面这一句,则访问到此为止

    2. 注册自定义Filter

      @Bean
      public FilterRegistrationBean<OrderFilter> orderFilter() {
          FilterRegistrationBean<OrderFilter> filter = new FilterRegistrationBean<>();
          filter.setName("reqFilter");
          filter.setFilter(new ReqFilter());
          // 指定优先级
          filter.setOrder(1);
          return filter;
      }

       

  2. 过滤器、监听器、拦截器使用场景:

    1. 过滤器

      Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码、做一些业务逻辑判断等。其工作原理是,只要你在web.xml文件配置好要拦截的客户端请求,它都会帮你拦截到请求,此时你就可以对请求或响应(Request、Response)统一设置编码,简化操作;同时还可以进行逻辑判断,如用户是否已经登录、有没有权限访问该页面等等工作,它是随你的web应用启动而启动的,只初始化一次,以后就可以拦截相关的请求,只有当你的web应用停止或重新部署的时候才能销毁。

    2. 监听器

      Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener接口的服务器端程序,它也是随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。主要作用是:做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等等。

    3. 拦截器

      拦截器是在面向切面编程中应用的,就是在你的service或者一个方法前调用一个方法,或者在方法后调用一个方法比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。拦截器不是在web.xml配置的,比如struts在struts.xml配置,在springMVC在spring与springMVC整合的配置文件中配置。


      过滤器(Filter):当你有一堆东西的时候,你只希望选择符合你要求的某一些东西。定义这些要求的工具,就是过滤器。
      拦截器(Interceptor):在一个流程正在进行的时候,你希望干预它的进展,甚至终止它进行,这是拦截器做的事情。
      监听器(Listener):当一个事件发生的时候,你希望获得这个事件发生的详细信息,而并不想干预这个事件本身的进程,这就要用到监听器。

       

      举例:某个用户在未登录的情况下点击购买,则会调用拦截器(没有登录当然无法下单,故我们需要干预他的进展),而不是其他两个。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值