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

 更新时间:2019年06月18日 14:56:43   作者:克里斯朵夫李维  
这篇文章主要介绍了SpringBoot中使用Filter和Interceptor的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、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。

三、调用顺序

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

相关文章

  • 使用IntelliJ IDEA搭建SSM框架的图文教程

    使用IntelliJ IDEA搭建SSM框架的图文教程

    本文通过图文并茂的形式给大家介绍了使用IntelliJ IDEA搭建SSM框架的教程,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-05-05
  • 详解spring boot jpa整合QueryDSL来简化复杂操作

    详解spring boot jpa整合QueryDSL来简化复杂操作

    这篇文章主要介绍了详解spring boot jpa整合QueryDSL来简化复杂操作,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • SpringBoot中使用RocketMQ的示例代码

    SpringBoot中使用RocketMQ的示例代码

    本文主要介绍SpringBoot中使用RocketMQ的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Spring Boot + Mybatis 实现动态数据源案例分析

    Spring Boot + Mybatis 实现动态数据源案例分析

    这篇文章主要介绍了Spring Boot + Mybatis 实现动态数据源,需要的朋友可以参考下
    2018-11-11
  • SpringMVC如何获取多种类型数据响应

    SpringMVC如何获取多种类型数据响应

    这篇文章主要介绍了SpringMVC如何获取多种类型数据响应,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-11-11
  • Spring中Transactional注解使用的心得(推荐)

    Spring中Transactional注解使用的心得(推荐)

    这篇文章主要介绍了Spring中Transactional注解使用的心得,事务是用来控制数据的ACID特性的,用于保证数据的正确性和完整性,需要的朋友可以参考下
    2022-10-10
  • Java使用Cipher类实现加密的过程详解

    Java使用Cipher类实现加密的过程详解

    这篇文章主要介绍了Java使用Cipher类实现加密的过程详解,Cipher类提供了加密和解密的功能,创建密匙主要使用SecretKeySpec、KeyGenerator和KeyPairGenerator三个类来创建密匙。感兴趣可以了解一下
    2020-07-07
  • spring中向一个单例bean中注入非单例bean的方法详解

    spring中向一个单例bean中注入非单例bean的方法详解

    Spring是先将Bean对象实例化之后,再设置对象属性,所以会先调用他的无参构造函数实例化,每个对象存在一个map中,当遇到依赖,就去map中调用对应的单例对象,这篇文章主要给大家介绍了关于spring中向一个单例bean中注入非单例bean的相关资料,需要的朋友可以参考下
    2021-07-07
  • JAVA操作HDFS案例的简单实现

    JAVA操作HDFS案例的简单实现

    本篇文章主要介绍了JAVA操作HDFS案例的简单实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • java编写创建数据库和表的程序

    java编写创建数据库和表的程序

    这篇文章主要为大家详细介绍了java编写创建数据库和表的程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10

最新评论