首页 > 解决方案 > 配置 Spring Data REST 以允许跨域请求

问题描述

我在 Kotlin 中建立了一个简单的 Spring Data REST 项目,其中包含两个 @RepositoryRestResource 注释存储库。我通过调用 Postman 和浏览器中的端点来验证它们工作正常。现在我将它连接到 Vue 前端,我正在使用 CORS 安全措施,但我似乎无法找到允许正确来源的方法。

我已经尝试了这里提到的每一个修复,在 Spring 的 Github 和博客上,但我似乎做错了什么。我的代码如下所示:

应用:

@SpringBootApplication
@EnableConfigurationProperties(MyProperties::class)
class MyApplication

fun main(args: Array<String>) {
    SpringApplication.run(MyApplication::class.java, *args)
}

存储库:

@CrossOrigin("http://localhost:8081", maxAge = 3600)
@RepositoryRestResource
interface SongRepository : CrudRepository<Song, Long> {
    fun findByTitle(title: String): Song?
    fun findBySlug(slug: String): Song?
    fun findAllByOrderByAddedAtDesc(): Iterable<Song>
}

@CrossOrigin("http://localhost:8081", maxAge = 3600)
@RepositoryRestResource
interface UserRepository : CrudRepository<User, Long> {
    fun findByEmail(login: String): User?
}

配置:

@Configuration
class WebConfiguration {

    @Bean
    fun corsConfigurer(): WebMvcConfigurer? {
        return object : WebMvcConfigurer {
            override fun addCorsMappings(registry: CorsRegistry) {
                registry.addMapping("/api/**")
                    .allowedOrigins("http://localhost:8081/")
            }
        }
    }

    @Bean
    fun repositoryRestConfigurer(): RepositoryRestConfigurer? {
        return object : RepositoryRestConfigurer {
            override fun configureRepositoryRestConfiguration(
                configuration: RepositoryRestConfiguration,
                corsRegistry: CorsRegistry
            ) {
                corsRegistry.addMapping("/api/**")
                    .allowedMethods("*")
                    .allowedOrigins("http://localhost:8081/")
            }
        }
    }

    @Bean
    fun corsFilter(): FilterRegistrationBean<*> {
        val source = UrlBasedCorsConfigurationSource()
        val config = CorsConfiguration()
        config.allowCredentials = true
        config.addAllowedOrigin("http://localhost:8081/")
        config.addAllowedHeader("*")
        config.addAllowedMethod("*")
        source.registerCorsConfiguration("/**", config)
        val bean: FilterRegistrationBean<*> = FilterRegistrationBean(CorsFilter(source))
        bean.order = Ordered.HIGHEST_PRECEDENCE
        return bean
    }
}

在最后一堂课中,我添加了所有可用的解决方案,并且在存储库中添加了@CrossOrigin 注释,但到目前为止还没有运气。有什么想法我在这里做错了吗?

标签: springkotlincorsspring-data-rest

解决方案


推荐阅读