文章目录
- 一、起因
- 二、解决方法
一、起因
使用了gateway
微服务作为整体的网关,并且整合了Spring Security6
;还有一个system微服务,作为被请求的资源,当浏览器向gateway
发送请求,请求system
资源时,遇到CORS
问题。
于是我在system
对应的controller
上加了@CrossOrigin
,无效;配置WebMvcConfigurer
,也无效。
后来发现,会不会是gateway
的spring security6
在一开始就拦截了CORS
跨域请求,导致根本走不到后面的system
配置。
查询了一波,果然如此。这里记录解决方法。
二、解决方法
这是依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-oauth2-resource-server</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>
这是配置
@EnableWebFluxSecurity@Configurationpublic class SecurityConfig {//安全拦截配置@Beanpublic SecurityWebFilterChain webFluxSecurityFilterChain(ServerHttpSecurity http) throws Exception {return http.cors(cors -> cors.configurationSource(corsConfigurationSource())).authorizeExchange(exchanges ->exchanges.pathMatchers("/**").permitAll().anyExchange().authenticated()).oauth2ResourceServer(oauth2 -> oauth2.jwt(Customizer.withDefaults())).csrf(ServerHttpSecurity.CsrfSpec::disable).build();}@Beanpublic CorsConfigurationSource corsConfigurationSource() {CorsConfiguration corsConfig = new CorsConfiguration();corsConfig.addAllowedOriginPattern("*"); // 允许任何源corsConfig.addAllowedMethod("*"); // 允许任何HTTP方法corsConfig.addAllowedHeader("*"); // 允许任何HTTP头corsConfig.setAllowCredentials(true); // 允许证书(cookies)corsConfig.setMaxAge(3600L); // 预检请求的缓存时间(秒)UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**", corsConfig); // 对所有路径应用这个配置return source;}}
需要注意的是,在gateway
的spring security
中处理了CORS
问题后,后续的system
什么的,就不需要再二次处理了。因为CORS
是一个浏览器的策略,只要处理一次,告诉浏览器我允许跨域,浏览器收到后就不再阻拦请求了。