SpringBoot跨域加SpringSecurity就失效( 六 )
注册 CorsFilter 的方式 , 这个 Filter 最终会被直接注册到 Servlet container 中被使用到 。
注册 CorsConfigurationSource 的方式 , 会用这个 source 创建一个 CorsFiltet 然后注册到 Servlet container 中被使用到 。
而第四步的情况比较复杂 。 HandlerMappingIntrospector 是 Spring Web 提供的一个类 , 实现了 CorsConfigurationSource 接口 , 所以在 MvcCorsFilter 中 , 它被直接用于创建 CorsFilter 。 它实现的 getCorsConfiguration 方法 , 会经历:
- 遍历 HandlerMapping 。
- 调用 getHandler 方法得到 HandlerExecutionChain 。
- 从中找到 CorsConfigurationSource 的实例 。
- 调用这个实例的 getCorsConfiguration 方法 , 返回得到的 CorsConfiguration 。
所以第四步实际上匹配的是实现 WebMvcConfigurer.addCorsMappings 方法的方式 。
由于在 CorsFilter 中每次处理请求时都会调用 CorsConfigurationSource.getCorsConfiguration 方法 , 而 DispatcherServlet 中也会每次调用 HandlerMapping.getHandler 方法 , 再加上这时的 HandlerExecutionChain 中还有 CorsInterceptor , 所以使用这个方式相对于其他方式 , 做了很多重复的工作 。 所以 WebMvcConfigurer.addCorsMappings + HttpSecurity.cors 的方式降低了我们代码的效率 , 也许微乎其微 , 但能避免的情况下 , 还是不要使用 。
5.3.3 HttpSecurity 中的 filters 属性在 CorsConfigurer.configure 方法中调用的 HttpSecurity.addFilter 方法 , 由它的父类 HttpSecurityBuilder 声明 , 并约定了很多 Filter 的顺序 。 然而 CorsFilter 并不在其中 。 不过在 Spring Security 中 , 目前还只有 HttpSecurity 这一个实现 , 所以我们来看看这里的代码实现就知道 CorsFilter 会排在什么地方了 。
public HttpSecurity addFilter(Filter filter) {Class extends Filter> filterClass = filter.getClass();if (!comparator.isRegistered(filterClass)) {throw new IllegalArgumentException("...");}this.filters.add(filter);return this;}
我们可以看到 , Filter 会被直接加到 List 中 , 而不是按照一定的顺序来加入的 。 但同时 , 我们也发现了一个 comparator 对象 , 并且只有被注册到了该类的 Filter 才能被加入到 filters 属性中 。 这个 comparator 又是用来做什么的呢?在 Spring Security 创建过程中 , 会调用到 HttpSeciryt.performBuild 方法 , 在这里我们可以看到 filters 和 comparator 是如何被使用到的 。
protected DefaultSecurityFilterChain performBuild() throws Exception {Collections.sort(filters, comparator);return new DefaultSecurityFilterChain(requestMatcher, filters);}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- SpringBoot常用注解
- 阿里爆款SpringBoot项目实战PDF+源码+视频分享
- 全网最深分析:SpringBoot MVC自动配置失效的原因
- SpringBoot+MyBatis+MySQL读写分离实现
- 从零手写并发框架(四)异步转同步 springboot 整合
- SpringBoot配置数据源及MyBatis分页的要点
- 刷新认知!h2database在springboot中的使用
- 「尝鲜」SpringBoot 快速整合 Swagger3.0
- SpringBoot内置http编码功能为例分析自动配置过程
- SpringBoot扫描不到组件?给你提供几种方案