SpringBootFilter顺序源码分析

SpringBootFilter顺序源码分析


2023年12月27日发(作者:)

SpringBootFilter顺序源码分析

SpringBoot是一个用于快速创建独立、生产级别的Spring应用程序的框架。Spring Boot Filter是一个用来拦截和处理请求的组件,它可以在处理请求之前和之后执行一些操作,比如:鉴权、日志记录等。本文将对Spring Boot Filter的顺序进行源码分析。

在Spring Boot中,过滤器的执行顺序是非常重要的,因为过滤器的顺序决定了它们的执行顺序。Spring Boot使用一个FilterRegistrationBean来注册过滤器,并提供了一种简单的方式来管理过滤器的顺序。

```java

public class FilterConfig

public FilterRegistrationBean firstFilte

FilterRegistrationBean registrationBean = new

FilterRegistrationBean<>(;

ter(new CustomFilter1();

Patterns("/*");

er(1);

return registrationBean;

}

public FilterRegistrationBean secondFilte

FilterRegistrationBean registrationBean = new

FilterRegistrationBean<>(;

ter(new CustomFilter2();

Patterns("/*");

er(2);

return registrationBean;

}

```

在上面的示例中,我们创建了两个自定义的过滤器CustomFilter1和CustomFilter2,并使用FilterRegistrationBean来注册它们。设置setOrder方法来指定过滤器的顺序,数字越小,优先级越高。

接下来我们来看一下Spring Boot中过滤器的执行顺序是如何确定的。在Spring Boot中,过滤器的执行顺序是通过FilterChain来确定的。

```java

public class WebFilterChainProxy extends GenericFilterBean

...

private void initFilterChains(FilterChainManager manager,

ServletContext servletContext)

...

for (Filter filter : getFilters(beanName))

ter(new FilterHolder(filter), beanName);

}

...

}

```

在上面的代码中,WebFilterChainProxy类继承自GenericFilterBean,并在initFilterChains方法中通过调用FilterChainManager的addFilter方法来添加过滤器。

```java

public class FilterChainManager

...

public void addFilter(FilterHolder filterHolder, String

chainName)

// 通过FilterChainResolver获取对应的filterChain

FilterChain filterChain = getChain(chainName);

ter(filterHolder);

}

...

```

在FilterChainManager的addFilter方法中,通过调用getChain方法来获取FilterChain。而getChain方法是在FilterChainResolver中实现的。

```java

public class FilterChainResolver

...

public FilterChain getChain(ServletRequest request,

ServletResponse response, FilterChain originalChain)

...

List matches = new ArrayList<>(;

for (Filter filter : chain)

if (filter instanceof OncePerRequestFilter && !(filter

instanceof FilterChainProxy))

(filter);

}

}

...

return new FilterChainProxy(matches);

}

...

```

在FilterChainResolver的getChain方法中,首先将所有的过滤器按照一定规则进行筛选,并最终返回一个FilterChainProxy对象。FilterChainProxy类是Spring Security框架中的一个类,它表示一个过滤器链。

```java

public class FilterChainProxy extends GenericFilterBean

...

public void doFilter(ServletRequest request, ServletResponse

response, FilterChain chain)

throws IOException, ServletException

...

for (Filter filter : filters)

er(request, response, chain);

}

...

}

...

```

在FilterChainProxy的doFilter方法中,依次调用filters集合中的过滤器的doFilter方法来处理请求。这就是Spring Boot中过滤器的执行顺序的源码分析。

总结:

SpringBootFilter的执行顺序是通过FilterChain来确定的,而FilterChain的创建是在FilterChainManager中实现的。FilterChainManager通过调用FilterChainResolver的getChain方法来获取FilterChain。在getChain方法中,按照一定规则筛选过滤器,并返回一个FilterChainProxy对象。最后,通过FilterChainProxy的doFilter方法依次调用过滤器的doFilter方法来处理请求。


发布者:admin,转转请注明出处:http://www.yc00.com/web/1703692276a1312702.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信