Проблема Access-Control-Allow-Origin в заголовке ktor cors

Я создаю простой REST API с использованием ktor и используемых cors, но когда я отправляю простой запрос get без данных заголовков, сервер работает нормально, но если я хочу, чтобы клиент имел ключ say:1 сервер не отвечает мне правильно, он говорит, что проблема в

Failed to load http://127.0.0.1:8080/test: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. The response had HTTP status code 403.

так вот мой код ктор

install(ContentNegotiation) {
        gson {
        }
    }
    install(ForwardedHeaderSupport)
    install(DefaultHeaders)
    install(CORS)
    {
        method(HttpMethod.Options)
        method(HttpMethod.Get)
        method(HttpMethod.Post)
        method(HttpMethod.Put)
        method(HttpMethod.Delete)
        method(HttpMethod.Patch)
        header(HttpHeaders.AccessControlAllowHeaders)
        header(HttpHeaders.ContentType)
        header(HttpHeaders.AccessControlAllowOrigin)
        allowCredentials = true
        anyHost()
        maxAge = Duration.ofDays(1)
    }
...
 get("test"){
            val a =  call.request.headers["key"]
            println(a)
            call.respond(Product(name = a))
        }

и мой код JavaScript выглядит следующим образом....

fetch('http://shop-ix.uz:8080/test', {
 headers: {
 "key": "1" 
})
   .then(response => response.json())
   .then(json => {    
     console.log(json);
   })

Помогите мне, пожалуйста

3 ответа

Вы должны внести в белый список свои заголовки, как это:

install(CORS) {
  header("key")
}

Это нужно делать с каждым настраиваемым HTTP-заголовком, который вы намереваетесь использовать.

Убедитесь, что все заголовки и необходимые методы разрешены во время установки Ktor CORS. Я столкнулся с той же проблемой, потом понял, что не добавилХотя в заголовке запроса он присутствовал. Из-за этого я получаю запрещенную ошибку (403)!

Заголовок моего запроса!

      Axios({
        method: 'GET',
        url: 'http://127.0.0.1:8080/connect',
        headers: {
            "Access-Control-Allow-Origin": "*",
            "Content-Type": "application/json",
        },
        params: {
          ...
        }
})

Разрешение CORS

          install(CORS) {
        allowMethod(HttpMethod.Options)
        allowMethod(HttpMethod.Post)
        allowMethod(HttpMethod.Get)
        allowHeader(HttpHeaders.AccessControlAllowOrigin)
        allowHeader(HttpHeaders.ContentType)
        anyHost()
    }

Убедитесь, что то, что требуется вашему заголовку запроса, разрешено на сервере во время CORS.

install(CORS) {
   exposeHeader("key")
}

разница между header и exposeHeader - сначала разрешить вызов с этим заголовком, но второй разрешить использовать его на стороне клиента

Другие вопросы по тегам