对于云Paas平台,对外提供的API需要满足客户多种场景的调用需求,其中就包括WEB端的对接。由于浏览器同源策略的限制,SpringCloudGateway接收到的客户WEB场景下请求必然存在跨域问题,浏览器将CORS请求分成两类:简单请求(simplerequest)和非简单请求(not-so-simplerequest)。这篇文章对CORS进行了详细的介绍,拜读之后受益匪浅。https://www.ruanyifeng.com/blog/2016/04/cors.html
SpringBoot自动装配的核心就是在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,使自动配置类生效,帮我们进行自动配置工作。
SimpleUrlHandlerMappingGlobalCorsAutoConfiguration类
SimpleUrlHandlerMapping类是AbstractHandlerMapping的子类,实际进入的是AbstractHandlerMapping的setCorsConfigurations方法。
Gateway对CORS处理的核心方法是AbstractHandlerMapping的getHandler(exchange)方法,我们在配置文件中指定的全局跨域规则就是在这个方法里生效的!
UrlBasedCorsConfigurationSource类的getCorsConfiguration(exchange)方法简单明了,Spring5使用了全新的路径解析器PathPattern,抛弃了原先的AntPathMatcher。新的路径匹配器围绕着PathPattern拥有一套体系,在设计上更具模块化、更加面向对象,从而拥有了更好的可读性和可扩展性。
如果CORS请求能够通过PathPattern与application.properties文件指定的配置相匹配,就能得到CorsConfiguration类,接着就是AbstractHandlerMapping中的getCorsProcessor().process(config,exchange)方法调用,对跨域请求Response请求HttpHeader的设置,通俗易懂,有兴趣的话可以分析一下。
CorsUtils工具类