Go Academy · Урок

Промежуточные обработчики CORS и восстановления после паники

Политики междоменных запросов и восстановление после паники

Урок 4 из 413 шагов

«Промежуточные обработчики CORS и восстановления после паники» — бесплатный урок Go Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.

Что такое CORS

Совместное использование ресурсов между источниками (CORS) — это механизм безопасности браузера, который ограничивает источники, с которых можно отправлять HTTP-запросы к вашему API. Сервер разрешает такие запросы, устанавливая заголовки ответа.

Предварительный запрос CORS

Перед междоменным запросом с пользовательским заголовком или нестандартным методом браузер отправляет предварительный запрос OPTIONS. Ваше промежуточное программное обеспечение должно обработать OPTIONS и вернуть 200 с заголовками CORS.

Промежуточное программное обеспечение CORS

Простое промежуточное программное обеспечение CORS для разработки:

func CORS(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("Access-Control-Allow-Origin", "https://myapp.com")
        w.Header().Set("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS")
        w.Header().Set("Access-Control-Allow-Headers", "Authorization,Content-Type")
        if r.Method == http.MethodOptions {
            w.WriteHeader(http.StatusOK); return
        }
        next.ServeHTTP(w, r)
    })
}

Разрешённые источники

Не используйте Access-Control-Allow-Origin: *, если задействованы учётные данные (файлы cookie, заголовки Authorization): указывайте явный источник. Для нескольких источников выполняйте проверку по списку разрешённых значений.

allowedOrigins := map[string]bool{
    "https://app.example.com": true,
    "https://dev.example.com": true,
}

if allowedOrigins[r.Header.Get("Origin")] {
    w.Header().Set("Access-Control-Allow-Origin", r.Header.Get("Origin"))
}

Access-Control-Allow-Credentials

Разрешите отправку файлов cookie и заголовков авторизации между источниками:

w.Header().Set("Access-Control-Allow-Credentials", "true")

Библиотека rs/cors

Используйте библиотеку github.com/rs/cors для производственного CORS с гибким сопоставлением источников, поддержкой учётных данных и кэшированием предварительных запросов.

c := cors.New(cors.Options{
    AllowedOrigins: []string{"https://example.com"},
    AllowedMethods: []string{"GET","POST","PUT","DELETE"},
    AllowedHeaders: []string{"Authorization","Content-Type"},
    AllowCredentials: true,
})
handler := c.Handler(mux)

Промежуточное программное обеспечение для восстановления после паники

Восстанавливайтесь после паники, чтобы сервер не завершил работу и не потерял все активные соединения:

func Recovery(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        defer func() {
            if rec := recover(); rec != nil {
                log.Printf("panic: %v\n%s", rec, debug.Stack())
                http.Error(w, "Internal Server Error", 500)
            }
        }()
        next.ServeHTTP(w, r)
    })
}

runtime/debug.Stack

При возникновении паники выводите полную трассировку стека горутины, чтобы упростить поиск корневой причины:

import "runtime/debug"
log.Printf("panic: %v\n%s", rec, debug.Stack())

Интеграция с Sentry

Перед возвратом клиенту 500 отправляйте паники в Sentry или аналогичные сервисы отслеживания ошибок внутри промежуточного программного обеспечения восстановления.

Порядок: Recovery первым внешним слоем

Всегда регистрируйте Recovery как самое внешнее (применяемое первым) промежуточное программное обеспечение, чтобы оно перехватывало паники из всех остальных компонентов промежуточного программного обеспечения и обработчиков.

handler := Recovery(RequestID(Logger(Auth(mux))))

Тестирование восстановления после паники

Напишите обработчик, который намеренно вызывает панику, вызовите его через промежуточное программное обеспечение в httptest и проверьте, что ответ равен 500.

panicHandler := http.HandlerFunc(func(_ http.ResponseWriter, _ *http.Request) { panic("test") })
w := httptest.NewRecorder()
Recovery(panicHandler).ServeHTTP(w, httptest.NewRequest("GET", "/", nil))
assert.Equal(t, 500, w.Code)

Быстрая проверка

Почему промежуточное программное обеспечение восстановления после паники должно быть самым внешним слоем?

Итоги: CORS и восстановление после паники

Основные положения:

  • CORS: устанавливайте заголовки Access-Control-Allow-* и обрабатывайте предварительные запросы OPTIONS
  • Allow-Origin: указывайте явный источник, а не *, если используются учётные данные
  • Recovery: defer recover() + журналирование трассировки стека + возврат 500
  • Recovery должно быть самым внешним промежуточным программным обеспечением
Можно начать бесплатно

Изучай Go с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
51
Уроки
203

Часто задаваемые вопросы

Урок «Промежуточные обработчики CORS и восстановления после паники» бесплатный?

Да — полный текст урока «Промежуточные обработчики CORS и восстановления после паники» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.

Чему я научусь в уроке «Промежуточные обработчики CORS и восстановления после паники»?

Политики междоменных запросов и восстановление после паники Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Go Academy?

Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Промежуточные обработчики CORS и восстановления после паники»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Go Academy?

Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Основы цепочки HTTP-промежуточных обработчиков
  2. Журналирование и промежуточный обработчик идентификатора запроса
  3. Промежуточные обработчики аутентификации и ограничения частоты
  4. Промежуточные обработчики CORS и восстановления после паники
← Назад к Go Academy