SpringBootFilter顺序源码分析
SpringBoot是一个用于快速创建独立、生产级别的Spring应用程序的框架。Spring Boot Filter是一个用来拦截和处理请求的组件,它可以在处理请求之前和之后执行一些操作,比如:鉴权、日志记录等。本文将对Spring Boot Filter的顺序进行源码分析。
在Spring Boot中,过滤器的执行顺序是非常重要的,因为过滤器的顺序决定了它们的执行顺序。Spring Boot使用一个FilterRegistrationBean来注册过滤器,并提供了一种简单的方式来管理过滤器的顺序。
```java
public class FilterConfig
public FilterRegistrationBean<CustomFilter1> firstFilte
FilterRegistrationBean<CustomFilter1> registrationBean = new FilterRegistrationBean<>(;
registrationBean.setFilter(new CustomFilter1();
registrationBean.addUrlPatterns("/*");
registrationBean.setOrder(1);
return registrationBean;
}
public FilterRegistrationBean<CustomFilter2> secondFilte
FilterRegistrationBean<CustomFilter2> registrationBean = new FilterRegistrationBean<>(;
registrationBean.setFilter(new CustomFilter2();
registrationBean.addUrlPatterns("/*");
registrationBean.setOrder(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))
manager.addFilter(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);
filterChain.addFilter(filterHolder);
}
...
```
在FilterChainManager的addFilter方法中,通过调用getChain方法来获取FilterChain。而getChain方法是在FilterChainResolver中实现的。
```java
public class FilterChainResolver
...
public FilterChain getChain(ServletRequest request, ServletResponse response, FilterChain originalChain)
...
List<Filter> matches = new ArrayList<>(;
for (Filter filter : chain)
if (filter instanceof OncePerRequestFilter && !(filter instanceof FilterChainProxy))
springboot和过滤器
matches.add(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