Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+717новых вакансий за сутки·60 871вакансия открыта сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 951
РезюмеAIПодготовкаСтатьи
ТарифыТарифы
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 391 кандидат открыт к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python9 224
  • Облачные технологии4 076
  • QA вакансии1 588
  • Android1 322
  • Инженер данных805
  • Продакт-менеджер368

Разработка

  • Backend вакансии1 317
  • iOS1 239
  • AI вакансии608
  • Fullstack вакансии523
  • Frontend вакансии456
  • Mobile вакансии28

По стеку

  • Go5 445
  • Java3 175
  • Kotlin1 119
  • Node.js1 026
  • Rust949
  • .NET666
  • PHP311
  • C#210
  • C++204

DevOps и инфраструктура

  • DevOps вакансии2 713
  • Kubernetes2 308
  • Linux-инфраструктура1 890
  • Terraform / IaC1 406
  • CI/CD842
  • Мониторинг и Observability645
  • SRE226
  • Кибербезопасность84

Аналитика и данные

  • Аналитик данных483
  • Data Scientist469
  • Бизнес-аналитик349
  • Системный аналитик48

Другие направления

  • Проджект-менеджер139
  • UI/UX дизайн71
  • Ручное тестирование14

По регионам

  • Вакансии в США24 791
  • Вакансии в Европе9 439
  • Работа в России2 924
  • Вакансии в Канаде2 178

По формату

  • Удалённые вакансии43 505
  • Релокация в США24 791
  • Гибридная работа3 370
  • Офисная работа2 525

По уровню

  • Senior вакансии20 898
  • Middle вакансии12 438
  • Junior вакансии3 864

Сейчас нанимают

Все компании
  • Wise191 вакансия
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis48 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме KtorВсе вопросы
KtorMiddleКодинг

Как реализовать CORS в приложении Ktor?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Устанавливайте плагин CORS через install(CORS) { allowHost(...); allowMethod(...); allowHeader(...) }. При allowCredentials = true нельзя использовать anyHost() — браузер требует точный Origin в ответе.

Подключение зависимости

// build.gradle.kts
dependencies {
    implementation("io.ktor:ktor-server-cors:2.3.12")
}

CORS в Ktor: плагин и его конфигурация

Ktor реализует CORS через встроенный плагин CORS из артефакта ktor-server-cors. Плагин перехватывает preflight-запросы (OPTIONS) и добавляет нужные заголовки к реальным ответам, не требуя ручной обработки в каждом маршруте.

Базовая конфигурация

import io.ktor.server.application.*
import io.ktor.server.plugins.cors.routing.*
import io.ktor.http.*

fun Application.configureHTTP() {
    install(CORS) {
        // Разрешённые источники
        allowHost("example.com", schemes = listOf("https"))
        allowHost("localhost:3000", schemes = listOf("http"))

        // Разрешённые HTTP-методы
        allowMethod(HttpMethod.Get)
        allowMethod(HttpMethod.Post)
        allowMethod(HttpMethod.Put)
        allowMethod(HttpMethod.Delete)
        allowMethod(HttpMethod.Patch)

        // Разрешённые заголовки запроса
        allowHeader(HttpHeaders.ContentType)
        allowHeader(HttpHeaders.Authorization)
        allowHeader("X-Custom-Header")

        // Разрешить передачу куки и заголовков авторизации
        allowCredentials = true

        // Заголовки, которые браузер может читать из ответа
        exposeHeader(HttpHeaders.ContentDisposition)

        // Время жизни preflight-кэша в браузере (сек)
        maxAgeInSeconds = 3600L
    }
}

Разрешить все источники (только для разработки)

install(CORS) {
    anyHost()  // НЕ использовать в продакшне
    allowMethod(HttpMethod.Get)
    allowMethod(HttpMethod.Post)
    allowHeader(HttpHeaders.ContentType)
}

Паттерн wildcard-поддомена

Ktor не поддерживает wildcards вида *.example.com нативно. Для динамической проверки источника используйте allowOrigins { origin -> ... }:

install(CORS) {
    allowOrigins { origin ->
        origin.endsWith(".example.com") || origin == "https://example.com"
    }
    allowMethod(HttpMethod.Get)
    allowHeader(HttpHeaders.ContentType)
    allowCredentials = true
}

Конфигурация через application.conf (HOCON)

ktor {
  application {
    modules = [ com.example.ApplicationKt.module ]
  }
}

cors {
  allowedHosts = ["example.com", "localhost:3000"]
}

Затем в коде читайте через environment.config.property("cors.allowedHosts").getList() и динамически вызывайте allowHost().

Важные нюансы работы плагина

  • Плагин устанавливается глобально и применяется ко всем маршрутам. Для route-level CORS нужно оборачивать роутинг вручную.
  • Preflight (OPTIONS) перехватывается плагином и не достигает ваших обработчиков.
  • При allowCredentials = true браузер требует точного указания Access-Control-Allow-Origin; anyHost() в этом режиме недопустим.

Подводные камни

  • anyHost() совместно с allowCredentials = true запрещён спецификацией CORS и вызовет исключение при старте в Ktor 2.x.
  • Если не добавить allowHeader(HttpHeaders.ContentType), запросы с JSON-телом (тип application/json) будут блокироваться как нераспознанные preflight.
  • Заголовки ответа, не перечисленные в exposeHeader(), недоступны JavaScript-клиенту даже при правильном CORS.
  • CORS-плагин необходимо устанавливать до плагина Authentication, иначе preflight может получить 401 вместо 204.
  • Ktor проверяет заголовок Origin строго: http://localhost:3000 и http://localhost:3000/ с трейлинг-слешем — разные строки.
  • В Ktor 2.x метод называется allowOrigins { }, а не host() из Ktor 1.x — при миграции старые проекты ломаются с Unresolved reference.
  • При maxAgeInSeconds браузер кэширует preflight-ответ; изменение CORS-политики на сервере не сразу отражается у клиентов без hard refresh.
  • Wildcard * в Access-Control-Allow-Headers не работает в IE и некоторых мобильных браузерах — явно перечисляйте каждый заголовок.

Частые вопросы на собеседовании

  • Какие security-риски возникают в Ktor при CORS, JWT/session auth и обработке multipart-загрузок?
  • Каковы варианты production-деплоя приложения Ktor?
  • Как определять маршруты (routes) в Ktor и как работает вложенная маршрутизация?
  • Что такое plugins (ранее features) в Ktor и как их устанавливать?

Типичные ошибки

  • Путать термин «ktor cors» с соседним механизмом Ktor.
  • Не называть границу lifecycle, transaction, thread или request для «ktor cors».
  • Игнорировать production-эффекты «ktor cors»: latency, SQL shape, memory, security или observability.

Что проверяет интервьюер

  • Попросить объяснить механизм «ktor cors» на минимальном примере.
  • Проверить, видит ли кандидат failure mode и диагностику для «ktor cors».
  • Уточнить, какие настройки или API меняют «ktor cors» в реальном сервисе.

Как вы знаете этот вопрос?

Проверить себя по теме Ktor →

Источники

  • https://ktor.io/docs/server-cors.html
←Предыдущий вопросЧто такое Ktor engines и в чём разница между CIO, Netty и Jetty?Следующий вопрос→Как сравнить Ktor с ближайшими backend-альтернативами по скорости разработки, производительности, экосистеме и эксплуатации?

Связанные темы

Ktorbackend-designimplementationktor