欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SpringBoot中使用Filter和Interceptor的示例代码

程序员文章站 2024-02-13 17:27:40
一、filter(过滤器) filter接口定义在javax.servlet包中,是servlet规范定义的,作用于request/response前后,被servl...

一、filter(过滤器)

filter接口定义在javax.servlet包中,是servlet规范定义的,作用于request/response前后,被servlet容器调用,当filter被sring管理后可以使用spring容器资源。

实现一个filter

自定义的过滤器需要实现javax.servlet.filter,filter接口中有三个方法:

  • init(filterconfig filterconfig):过滤器初始化的被调用。
  • dofilter(servletrequest servletrequest, servletresponse servletresponse, filterchain chain):在dofilter()方法中,chain.dofilter()前的一般是对request执行的过滤操作,chain.dofilter后面的代码一般是对response执行的操作,chain.dofiter()执行下一个过滤器或者业务处理器。
  • destory():过滤器销毁的时候被调用。

在spring容器中使用过滤器

通过filterregistrationbean

 @configuration
 public class webconfig{
  @bean
  public filterregistrationbean xxxfilter() {
    filterregistrationbean registrationbean = new filterregistrationbean();
    registrationbean.setfilter(new xxxfilter());
    registrationbean.seturlpatterns(arrays.aslist("/*"));
    registrationbean.setorder(1); // 过滤器的优先级
    return registrationbean;
  }
}  

通过@webfilter和@servletcomponentscan

通过@webfilter的方式定义filter,默认使用filter的类名设置优先级。使用filterregistrationbean可以指定优先级。filter使用白名单过滤url的方式,配置需要拦截的url,如果想设置不过滤某些url需要在dofilter方法中指定。

二、interceptor(拦截器)

定义一个interceptor需要实现org.springframework.web.servlet.handlerinterceptor接口,interceptor是spring容器定义的,它可以使用spring容器的任何资源,只要通过ioc注入到interceptor即可,interceptor可以深入到业务处理方法的执行前后和抛出异常的时候,而filerter无法做到这一点,所以interceptor相比filter具有更大的弹性。

实现一个interceptor

实现handlerinterceptor或者继承handlerinterceptoradapter

public interface handlerinterceptor {
  default boolean prehandle(httpservletrequest request, httpservletresponse response, object handler) throws exception {
    return true;
  }

  default void posthandle(httpservletrequest request, httpservletresponse response, object handler, @nullable modelandview modelandview) throws exception {
  }

  default void aftercompletion(httpservletrequest request, httpservletresponse response, object handler, @nullable exception ex) throws exception {
  }
}

  • prehandle:在业务处理器处理请求之前被调用。
  • posthandle:在业务处理器处理请求后并生成视图前被调用,此时有机会修改modelandview。
  • aftercompletion:业务处理处理器处理完请求后(已经渲染视图)被执行,并可以处理业务方法发生异常的场景。

在spring容器中使用拦截器

@configuration
public class webconfig implements webmvcconfigurer {

  @override
  public void addinterceptors(interceptorregistry registry) {
    interceptorregistration registration = registry.addinterceptor(new timeinterceptor());
    registration.excludepathpatterns("/user");
    registration.excludepathpatterns("/*");
  }
}  

interceptor既可以指定要过滤的url也可以指定不拦截的url,缺省情况拦截所有url。

三、调用顺序

SpringBoot中使用Filter和Interceptor的示例代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。