SpringBoot跨域加SpringSecurity就失效( 三 )


Interceptor 由 Spring 自己定义 , 由 DispatcherServlet 调用 , 可以定义在 Handler 调用前后的行为 。 这里的 Handler, 在多数情况下 , 就是我们的 Controller 中对应的方法 。
对于 Filter 和 Interceptor 的复习就到这里 , 我们只需要知道它们会在什么时候被调用到 , 就能理解后面的内容了 。
5.2 WebMvcConfigurer.addCorsMappings 方法做了什么我们从 WebMvcConfigurer.addCorsMappings 方法的参数开始 , 先看看 CORS 配置是如何保存到 Spring 上下文中的 , 然后在了解一下 Spring 是如何使用的它们 。
5.2.1 注入 CORS 配置5.2.1.1 CorsRegistry 和 CorsRegistrationWebMvcConfigurer.addCorsMappings 方法的参数 CorsRegistry 用于注册 CORS 配置 , 它的源码如下:
public class CorsRegistry {private final List registrations = new ArrayList<>();public CorsRegistration addMapping(String pathPattern) {CorsRegistration registration = new CorsRegistration(pathPattern);this.registrations.add(registration);return registration;}protected Map getCorsConfigurations() {Map configs = new LinkedHashMap<>(this.registrations.size());for (CorsRegistration registration : this.registrations) {configs.put(registration.getPathPattern(), registration.getCorsConfiguration());}return configs;}}我们发现这个类仅仅有两个方法:

  • addMapping 接收一个 pathPattern , 创建一个 CorsRegistration 实例 , 保存到列表后将其返回 。 在我们的代码中 , 这里的 pathPattern 就是 /hello 。
  • getCorsConfigurations 方法将保存的 CORS 规则转换成 Map 后返回 。
CorsRegistration 这个类 , 同样很简单 , 我们看看它的部分源码:
public class CorsRegistration {private final String pathPattern;private final CorsConfiguration config;public CorsRegistration(String pathPattern) {this.pathPattern = pathPattern;this.config = new CorsConfiguration().applyPermitDefaultValues();}public CorsRegistration allowedOrigins(String... origins) {this.config.setAllowedOrigins(Arrays.asList(origins));return this;}}不难发现 , 这个类仅仅保存了一个 pathPattern 字符串和 CorsConfiguration , 很好理解 , 它保存的是一个 pathPattern 对应的 CORS 规则 。
在它的构造函数中 , 调用的 CorsConfiguration.applyPermitDefaultValues 方法则用于配置默认的 CORS 规则:
  • allowedOrigins 默认为所有域 。
  • allowedMethods 默认为 GET 、HEAD 和 POST 。
  • allowedHeaders 默认为所有 。
  • maxAge 默认为 30 分钟 。
  • exposedHeaders 默认为 null , 也就是不暴露任何 header 。
  • credentials 默认为 null 。
创建 CorsRegistration 后 , 我们可以通过它的 allowedOrigins、allowedMethods 等方法修改它的 CorsConfiguration , 覆盖掉上面的默认值 。
现在 , 我们已经通过 WebMvcConfigurer.addCorsMappings 方法配置好 CorsRegistry 了 , 接下来看看这些配置会在什么地方被注入到 Spring 上下文中 。
5.2.1.2 WebMvcConfigurationSupportCorsRegistry.getCorsConfigurations 方法 , 会被 WebMvcConfigurationSupport.getConfigurations 方法调用 , 这个方法如下:
protected final Map getCorsConfigurations() {if (this.corsConfigurations == null) {CorsRegistry registry = new CorsRegistry();addCorsMappings(registry);this.corsConfigurations = registry.getCorsConfigurations();}return this.corsConfigurations;}


推荐阅读