Промежуточные обработчики CORS и восстановления после паники
Политики междоменных запросов и восстановление после паники
«Промежуточные обработчики 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 — локальная установка не требуется.
Все уроки этого курса
- Основы цепочки HTTP-промежуточных обработчиков
- Журналирование и промежуточный обработчик идентификатора запроса
- Промежуточные обработчики аутентификации и ограничения частоты
- Промежуточные обработчики CORS и восстановления после паники