2023年12月27日发(作者:)
SpringBootFilter顺序源码分析
SpringBoot是一个用于快速创建独立、生产级别的Spring应用程序的框架。Spring Boot Filter是一个用来拦截和处理请求的组件,它可以在处理请求之前和之后执行一些操作,比如:鉴权、日志记录等。本文将对Spring Boot Filter的顺序进行源码分析。
在Spring Boot中,过滤器的执行顺序是非常重要的,因为过滤器的顺序决定了它们的执行顺序。Spring Boot使用一个FilterRegistrationBean来注册过滤器,并提供了一种简单的方式来管理过滤器的顺序。
```java
public class FilterConfig
public FilterRegistrationBean
FilterRegistrationBean
FilterRegistrationBean<>(;
ter(new CustomFilter1();
Patterns("/*");
er(1);
return registrationBean;
}
public FilterRegistrationBean
FilterRegistrationBean
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
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条)