Middleware de CORS e recuperação de panic
Políticas entre origens e recuperação após panics
Middleware de CORS e recuperação de panic é uma aula grátis de Go Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Go Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Go Academy inclui 4 aulas no total.
O que é CORS?
O Compartilhamento de recursos entre origens (CORS) é um mecanismo de segurança do navegador que restringe quais origens podem fazer solicitações HTTP à sua API. O servidor permite isso definindo cabeçalhos de resposta.
Solicitação preliminar do CORS
Antes de uma solicitação entre origens com um cabeçalho personalizado ou um método não simples, o navegador envia uma solicitação OPTIONS preliminar. Seu middleware deve tratar OPTIONS e retornar 200 com cabeçalhos CORS.
Middleware CORS
Um middleware CORS simples para desenvolvimento:
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)
})
}Origens permitidas
Não use Access-Control-Allow-Origin: * quando houver credenciais (cookies, cabeçalhos Authorization) envolvidas — use uma origem explícita. Para várias origens, compare-as com uma lista de permissões.
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 cookies e cabeçalhos de autorização sejam enviados entre origens:
w.Header().Set("Access-Control-Allow-Credentials", "true")Biblioteca rs/cors
Use a biblioteca github.com/rs/cors para obter um CORS adequado à produção, com correspondência flexível de origens, suporte a credenciais e armazenamento em cache de solicitações preliminares.
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 recuperação de pânico
Recupere-se de pânicos para impedir que o servidor trave e perca todas as conexões ativas:
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 o rastreamento completo da pilha da goroutine quando ocorrer um pânico para ajudar a diagnosticar a causa raiz:
import "runtime/debug"
log.Printf("panic: %v\n%s", rec, debug.Stack())Integração com o Sentry
Envie os pânicos ao Sentry ou a serviços semelhantes de rastreamento de erros dentro do middleware de recuperação, antes de retornar 500 ao cliente.
Ordem: Recovery na camada mais externa
Sempre registre Recovery como o middleware mais externo (aplicado primeiro), para que ele capture os pânicos de todos os outros middlewares e manipuladores.
handler := Recovery(RequestID(Logger(Auth(mux))))Testando a recuperação de pânico
Escreva um manipulador que provoque um pânico deliberadamente, chame-o por meio do middleware em um httptest e verifique se a resposta é 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)Verificação rápida
Por que o middleware de recuperação de pânico precisa ser a camada mais externa?
Recapitulação: CORS e recuperação de pânico
Pontos principais:
- CORS: defina os cabeçalhos Access-Control-Allow-* e trate a solicitação preliminar OPTIONS
- Allow-Origin: origem explícita (não *) quando houver credenciais
- Recovery: defer recover() + registre o rastreamento da pilha + retorne 500
- Recovery deve ser o middleware mais externo
Aprenda Go com um tutor de IA — grátis
Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.
- Cursos
- 51
- Aulas
- 203
Perguntas Frequentes
A aula “Middleware de CORS e recuperação de panic” é grátis?
Sim — o texto completo de “Middleware de CORS e recuperação de panic” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Go Academy, atualize para CoddyKit PRO. O curso de Go Academy inclui 4 aulas no total.
O que vou aprender em “Middleware de CORS e recuperação de panic”?
Políticas entre origens e recuperação após panics Você pratica Go Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Go Academy?
Nenhuma experiência prévia é necessária. Go Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Middleware de CORS e recuperação de panic”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Go Academy?
Sim. Cada aula de Go Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Fundamentos da cadeia de middleware HTTP
- Middleware de logging e ID de requisição
- Middleware de autenticação e limitação de taxa
- Middleware de CORS e recuperação de panic