Middleware de CORS y recuperación ante panics
Políticas entre orígenes y recuperación ante panics
Middleware de CORS y recuperación ante panics es una lección gratuita de Go Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Go Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Go Academy incluye 4 lecciones en total.
¿Qué es CORS?
Cross-Origin Resource Sharing (CORS) es un mecanismo de seguridad del navegador que restringe qué orígenes pueden realizar solicitudes HTTP a su API. El servidor lo habilita estableciendo encabezados de respuesta.
Preflight de CORS
Antes de una solicitud entre orígenes con un encabezado personalizado o un método no simple, el navegador envía una solicitud OPTIONS de preflight. Su middleware debe gestionar OPTIONS y devolver 200 con los encabezados de CORS.
Middleware de CORS
Un middleware de CORS sencillo para desarrollo:
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)
})
}Orígenes permitidos
No utilice Access-Control-Allow-Origin: * cuando intervengan credenciales (cookies o encabezados Authorization); utilice un origen explícito. Compruebe el origen con una lista de permitidos si hay varios orígenes.
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
Permita que se envíen cookies y encabezados de autorización entre orígenes:
w.Header().Set("Access-Control-Allow-Credentials", "true")Biblioteca rs/cors
Utilice la biblioteca github.com/rs/cors para disponer de un CORS de nivel de producción con coincidencia flexible de orígenes, compatibilidad con credenciales y almacenamiento en caché de solicitudes preflight.
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)Middleware de recuperación de pánicos
Recupérese de los pánicos para evitar que el servidor se bloquee y pierda todas las conexiones activas:
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
Imprima el seguimiento completo de la pila de goroutines cuando se produzca un pánico para ayudar a diagnosticar la causa raíz:
import "runtime/debug"
log.Printf("panic: %v\n%s", rec, debug.Stack())Integración con Sentry
Envíe los pánicos a Sentry o a servicios similares de seguimiento de errores dentro del middleware de recuperación, antes de devolver 500 al cliente.
Orden: Recovery en el nivel más externo
Registre siempre Recovery como el middleware más externo (el primero que se aplica) para que capture los pánicos de todos los demás middlewares y handlers.
handler := Recovery(RequestID(Logger(Auth(mux))))Pruebas de recuperación de pánicos
Escriba un handler que provoque un pánico deliberadamente, llámelo a través del middleware en un httptest y compruebe que la respuesta sea 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)Comprobación rápida
¿Por qué debe estar el middleware de recuperación de pánicos en la capa más externa?
Resumen: CORS y recuperación de pánicos
Puntos clave:
- CORS: establecer encabezados Access-Control-Allow-* y gestionar el preflight OPTIONS
- Allow-Origin: utilizar un origen explícito, no *, cuando intervengan credenciales
- Recovery: defer recover() + registrar el seguimiento de la pila + devolver 500
- Recovery debe ser el middleware más externo
Preguntas frecuentes
¿La lección «Middleware de CORS y recuperación ante panics» es gratis?
Sí — el texto completo de «Middleware de CORS y recuperación ante panics» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Go Academy, actualiza a CoddyKit PRO. El curso de Go Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Middleware de CORS y recuperación ante panics»?
Políticas entre orígenes y recuperación ante panics Practicas Go Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Go Academy?
No se requiere experiencia previa. Go Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Middleware de CORS y recuperación ante panics»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Go Academy?
Sí. Cada lección de Go Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Fundamentos de la cadena de middleware HTTP
- Middleware de registro e identificador de solicitud
- Middleware de autenticación y limitación de tasa
- Middleware de CORS y recuperación ante panics