Как вы справляетесь с добавлением заголовка CORS на сервере Spring Boot с graphql- kotlin? - PullRequest
2 голосов
/ 06 января 2020

Я строю простой проект Spring Server, используя библиотеку GraphQL Kotlin , созданную и открытую из Expedia. У меня есть бэкэнд и он работает, общается с хранилищем данных, и я могу получать данные, отправляя запросы через Playground.

Когда я пытаюсь подключиться из моего интерфейса React (используя Apollo), начальные ОПЦИИ запрос получает ответ 404 из-за проблемы CORS. Я относительно новичок в Spring Boot, и есть много потенциальных подходов, документированных в SO и других местах.

Как мне перехватить ответ и добавить соответствующий заголовок Access-Control-Allow-Origin?

Ответы [ 3 ]

1 голос
/ 03 марта 2020

Вы можете сделать так:

 @Bean
    @Profile("!production")
    fun corsFilter(): CorsWebFilter = CorsWebFilter(
        UrlBasedCorsConfigurationSource().apply {
            registerCorsConfiguration(
                "/**",
                CorsConfiguration().apply {
                    allowCredentials = true
                    allowedOrigins = listOf("*")
                    allowedHeaders = listOf("*")
                    allowedMethods = listOf("*")
                }
            )
        }
    )
1 голос
/ 06 января 2020

Попробовав многие из вышеупомянутых подходов, я нашел тот, который работал для моей конкретной комбинации переменных.

Например, они не работали:

  1. Компонент WebFluxConfigurer, который переопределяет аннотацию addCorsMappings function
  2. @CrossOrigin для функции запроса
  3. Добавьте библиотеку привода пружинной загрузки в проект и добавьте конфигурацию management.endpoints.web.cors в application.yml Согласно документации Spring

В конечном итоге у меня сработал собственный подкласс WebFilter, согласно этому вопросу SO: Включить CORS в Spring 5 Webflux?

, а также это руководство , в котором много рассказывалось о том, как Spring Boot работает в целом.

0 голосов
/ 20 февраля 2020

Только добавление следующей конфигурации в весенний загрузчик - сервер kotlin работает с React и Apollo:

import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.http.HttpMethod
import org.springframework.http.HttpStatus
import org.springframework.web.cors.reactive.CorsUtils
import org.springframework.web.server.WebFilter
import reactor.core.publisher.Mono

@Configuration
class ReactiveConfigurations {

    companion object {
        const val ALLOWED_HEADERS = "x-requested-with, authorization, Content-Type, Authorization, credential, X-XSRF-TOKEN"
        const val ALLOWED_METHODS = "GET, PUT, POST, DELETE, OPTIONS"
        const val ALLOWED_ORIGIN = "*"
        const val MAX_AGE = "3600"
    }

    @Bean
    fun corsFilter(): WebFilter {
        return WebFilter { ctx, chain ->
            val request = ctx.request
            if (CorsUtils.isCorsRequest(request)) {
                val response = ctx.response
                val headers = response.headers
                headers.add("Access-Control-Allow-Origin", ALLOWED_ORIGIN)
                headers.add("Access-Control-Allow-Methods", ALLOWED_METHODS)
                headers.add("Access-Control-Max-Age", MAX_AGE)
                headers.add("Access-Control-Allow-Headers", ALLOWED_HEADERS)
                if (request.method === HttpMethod.OPTIONS) {
                    response.statusCode = HttpStatus.OK
                    return@WebFilter Mono.empty<Void>()
                }
            }
            chain.filter(ctx)
        }
    }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...