CORS header 'Access-Control-Allow-Origin' 缺少 Spring 数据 REST
CORS header ‘Access-Control-Allow-Origin’ missing with Spring Data REST
我正在尝试解决 spring data rest
的 CORS 问题,但似乎没有附加 CORS headers。这是我的配置:
@Component
class DataRestConfig: RepositoryRestConfigurer {
override fun configureRepositoryRestConfiguration(config: RepositoryRestConfiguration?, cors: CorsRegistry?) {
cors?.addMapping("/*")
?.allowedOrigins("*")
?.allowedMethods("GET", "PUT", "DELETE","PATCH","POST","OPTIONS")
}
}
我也遇到了与其他 API 路线相同的问题,这些路线超出了 spring 数据休息。这是我的 WebSecurityConfigurerAdapter
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
open class WebSecurityConfig(private val userDetailsServices: DatabaseUserDetailsServices, private val jwtService: JWTService): WebSecurityConfigurerAdapter() {
@Value("${auth.jwt.secret}")
private var secret: String = ""
override fun configure(http: HttpSecurity) {
http
.cors().and()
.csrf().disable()
.addFilterAfter(JWTAuthorizationFilter(userDetailsServices, secret, jwtService),UsernamePasswordAuthenticationFilter::class.java)
.authorizeRequests()
.antMatchers(HttpMethod.POST,UserController.LOGIN_URL).permitAll()
.antMatchers(HttpMethod.OPTIONS,"/**").permitAll()
.anyRequest().authenticated()
}
}
编辑:
- 添加了完整的
WebSecurityConfigurerAdapter
- 我注意到 OPTIONS 请求得到 403,这就是我为 OPTIONS 方法添加
antMatchers
但没有帮助的原因。
- 这是响应和请求 headers。没有回应 body:
您可以随时使用 CorsFilter
来修改响应 headers。在这里,我已经回答了如何在 Spring 引导中自定义 CorsFilter
- https://whosebug.com/a/66882700/3709922。请看一下。
如果使用 Spring MVC,您应该像这样配置 CORS 行为
@Configuration
public class CorsConfiguration implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://localhost:3000")
.allowedMethods("GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS");
}
}
我不知道为什么不考虑其他配置,我不知道这是否被认为是一个好的解决方案,但由于我只在本地环境中需要它,所以它并不那么重要。这就是我的工作方式:
@Bean
@Profile("local")
open fun corsConfigurationSource(): CorsConfigurationSource{
val cors = UrlBasedCorsConfigurationSource()
val config = CorsConfiguration().applyPermitDefaultValues()
config.addAllowedMethod(HttpMethod.OPTIONS)
config.addAllowedMethod(HttpMethod.POST)
config.addAllowedMethod(HttpMethod.PATCH)
config.addAllowedMethod(HttpMethod.DELETE)
cors.registerCorsConfiguration("/**", config)
return cors
}
我正在尝试解决 spring data rest
的 CORS 问题,但似乎没有附加 CORS headers。这是我的配置:
@Component
class DataRestConfig: RepositoryRestConfigurer {
override fun configureRepositoryRestConfiguration(config: RepositoryRestConfiguration?, cors: CorsRegistry?) {
cors?.addMapping("/*")
?.allowedOrigins("*")
?.allowedMethods("GET", "PUT", "DELETE","PATCH","POST","OPTIONS")
}
}
我也遇到了与其他 API 路线相同的问题,这些路线超出了 spring 数据休息。这是我的 WebSecurityConfigurerAdapter
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
open class WebSecurityConfig(private val userDetailsServices: DatabaseUserDetailsServices, private val jwtService: JWTService): WebSecurityConfigurerAdapter() {
@Value("${auth.jwt.secret}")
private var secret: String = ""
override fun configure(http: HttpSecurity) {
http
.cors().and()
.csrf().disable()
.addFilterAfter(JWTAuthorizationFilter(userDetailsServices, secret, jwtService),UsernamePasswordAuthenticationFilter::class.java)
.authorizeRequests()
.antMatchers(HttpMethod.POST,UserController.LOGIN_URL).permitAll()
.antMatchers(HttpMethod.OPTIONS,"/**").permitAll()
.anyRequest().authenticated()
}
}
编辑:
- 添加了完整的
WebSecurityConfigurerAdapter
- 我注意到 OPTIONS 请求得到 403,这就是我为 OPTIONS 方法添加
antMatchers
但没有帮助的原因。 - 这是响应和请求 headers。没有回应 body:
您可以随时使用 CorsFilter
来修改响应 headers。在这里,我已经回答了如何在 Spring 引导中自定义 CorsFilter
- https://whosebug.com/a/66882700/3709922。请看一下。
如果使用 Spring MVC,您应该像这样配置 CORS 行为
@Configuration
public class CorsConfiguration implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://localhost:3000")
.allowedMethods("GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS");
}
}
我不知道为什么不考虑其他配置,我不知道这是否被认为是一个好的解决方案,但由于我只在本地环境中需要它,所以它并不那么重要。这就是我的工作方式:
@Bean
@Profile("local")
open fun corsConfigurationSource(): CorsConfigurationSource{
val cors = UrlBasedCorsConfigurationSource()
val config = CorsConfiguration().applyPermitDefaultValues()
config.addAllowedMethod(HttpMethod.OPTIONS)
config.addAllowedMethod(HttpMethod.POST)
config.addAllowedMethod(HttpMethod.PATCH)
config.addAllowedMethod(HttpMethod.DELETE)
cors.registerCorsConfiguration("/**", config)
return cors
}