我使用Spring开发了后端微服务应用程序,并将API网关放在微服务的前面。为了对用户进行身份验证,我使用Keycloak。现在我正在使用Svelte开发前端应用程序,我在网关应用程序中配置了我的application.yml,如下所示:
spring:
cloud:
gateway:
default-filters:
- TokenRelay
- DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin
globalcors:
cors-configurations:
'[/**]':
allowedOrigins: "*"
allowedMethods: "*"
allowedHeaders: "*"
add-to-simple-url-handler-mapping: true但是,当我试图发送AJAX请求时,我会得到CORS错误。
此外,我还具有spring安全性(通过org.springframework.boot:spring-boot-starter-oauth2-client和org.springframework.boot:spring-boot-starter-oauth2-resource-server依赖项)。我将SecurityWebFilterChain定义为:
@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
http
.cors().and()
.authorizeExchange()
.pathMatchers("/actuator/**")
.permitAll()
.and()
.authorizeExchange()
.anyExchange()
.authenticated()
.and()
.oauth2Login(); // to redirect to oauth2 login page.
return http.build();
}当将前端构建放在静态文件夹中时,没有CORS错误,但是对于开发,我需要本地主机上不同端口的开发人员node.js服务器。
那么,如何解决这个cors问题呢?
发布于 2022-05-02 16:15:50
您可以创建一个类来定义这样的Cors映射:
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**");
}
}上面的示例支持从任何源到应用程序中任何端点的CORS请求。
为了更好地锁定这一点,registry.addMapping方法返回一个CorsRegistration对象,我们可以使用该对象进行额外的配置。还有一个allowedOrigins方法,它允许我们指定一个允许的起源数组。如果我们需要在运行时从外部源加载这个数组,这可能很有用。
此外,还有allowedMethods、allowedHeaders、exposedHeaders、maxAge和allowCredentials,我们可以使用它们来设置响应头和自定义选项。
具有Spring安全性的CORS:
如果在您的项目中使用Security,您必须采取额外的步骤,以确保它与CORS很好地合作。这是因为CORS需要先被处理。否则,Security将在请求到达Spring之前拒绝它。
幸运的是,Security提供了一个开箱即用的解决方案:
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.cors().and()...
}
}https://stackoverflow.com/questions/72087244
复制相似问题