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

作者:克里斯朵夫李维 时间:2022-06-28 17:20:04 

一、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的示例代码

来源:https://juejin.im/post/5d064bc0e51d4510aa0114f5

标签:SpringBoot,Filter,Interceptor
0
投稿

猜你喜欢

  • 一键清除maven仓库中下载失败的jar包的实现方法

    2023-08-13 03:43:59
  • 华为鸿蒙系统应用开发工具 DevEco Studio的安装和使用图文教程

    2022-09-14 05:04:23
  • Spring AOP源码深入分析

    2023-08-15 13:01:16
  • Java SpringMVC框架开发之数据导出Excel文件格式实例详解

    2023-11-10 21:11:18
  • Java Vector实现班级信息管理系统

    2023-11-25 03:09:09
  • JVM 心得分享(加载 链接 初始化)

    2023-09-01 19:17:50
  • springcloud feign传输List的坑及解决

    2023-06-20 18:31:57
  • 了解Java线程池创建过程

    2022-09-29 20:45:49
  • mybatis中的count()按条件查询方式

    2022-06-30 06:04:29
  • Java编程中使用throw关键字抛出异常的用法简介

    2023-08-27 17:04:19
  • SpringBoot如何进行对象复制的实践

    2023-11-23 03:40:19
  • Java手动实现Redis的LRU缓存机制

    2023-07-31 12:51:30
  • JavaWeb中导出excel文件的简单方法

    2023-11-13 02:41:43
  • Mybatis步骤分解实现一个增删改查程序

    2021-09-16 01:12:43
  • Java监听器的作用及用法代码示例

    2023-06-24 06:59:07
  • Spring Security使用中Preflight请求和跨域问题详解

    2021-06-12 11:04:15
  • SpringBoot整合dataworks的实现过程

    2023-11-29 12:13:09
  • SpringBoot利用jackson格式化时间的三种方法

    2022-03-26 22:28:56
  • 利用Java8 Optional类优雅如何地解决空指针问题

    2023-07-30 04:58:13
  • C#中在WebClient中使用post发送数据实现方法

    2023-05-01 00:03:54
  • asp之家 软件编程 m.aspxhome.com