Go Academy · Lektion

CORS- og panic recovery-middleware

Cross-origin-politikker og genoprettelse efter panics

Lektion 4 af 413 trin

CORS- og panic recovery-middleware er en gratis Go Academy-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Go Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Go Academy-kurset indeholder 4 lektioner i alt.

Hvad er CORS?

Ressourcedeling på tværs af oprindelser (CORS) er en sikkerhedsmekanisme i browsere, der begrænser, hvilke oprindelser der kan sende HTTP-anmodninger til din API. Serveren tilvælger det ved at sætte svarheadere.

CORS-preflight

Før en anmodning på tværs af oprindelser med en brugerdefineret header eller en ikke-simpel metode sender browseren en OPTIONS-preflight-anmodning. Din middleware skal håndtere OPTIONS og returnere 200 med CORS-headere.

CORS-middleware

En enkel CORS-middleware til udvikling:

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)
    })
}

Tilladte oprindelser

Brug ikke Access-Control-Allow-Origin: *, når legitimationsoplysninger (cookies, Authorization-headere) er involveret — brug en eksplicit oprindelse. Kontrollér den mod en hvidliste ved flere oprindelser.

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

Tillad, at cookies og Authorization-headere sendes på tværs af oprindelser:

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

rs/cors-bibliotek

Brug biblioteket github.com/rs/cors til produktionsklar CORS med fleksibel matching af oprindelser, understøttelse af legitimationsoplysninger og caching af preflight-anmodninger.

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 til gendannelse efter panik

Gendan efter panik for at forhindre, at serveren går ned og mister alle aktive forbindelser:

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

Udskriv det fulde stacktrace for goroutinen, når der opstår en panik, for at hjælpe med at diagnosticere den bagvedliggende årsag:

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

Sentry-integration

Send panikker til Sentry eller lignende tjenester til fejlhåndtering inde i recovery-middleware, før du returnerer 500 til klienten.

Rækkefølge: Recovery yderst

Registrér altid Recovery som den yderste middleware, altså den middleware der anvendes først, så den opfanger panikker fra alle andre middleware og handlere.

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

Test af panikgendannelse

Skriv en handler, der med vilje udløser en panik, kald den gennem middleware i en httptest, og kontrollér, at svaret er 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)

Hurtig kontrol

Hvorfor skal middleware til panikgendannelse være det yderste lag?

Opsummering: CORS og panikgendannelse

Vigtige punkter:

  • CORS: Sæt Access-Control-Allow-*-headere, og håndter OPTIONS-preflight
  • Allow-Origin: Brug en eksplicit oprindelse, ikke *, når legitimationsoplysninger er involveret
  • Recovery: defer recover() + log stacktrace + returnér 500
  • Recovery skal være den yderste middleware
Gratis at komme i gang

Lær Go med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
51
Lektioner
203

Ofte stillede spørgsmål

Er lektionen “CORS- og panic recovery-middleware” gratis?

Ja — alle 3 lektioner i læringssporet Go Academy, inklusive “CORS- og panic recovery-middleware”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Go Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “CORS- og panic recovery-middleware”?

Cross-origin-politikker og genoprettelse efter panics Du øver dig i Go Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Go Academy?

Der kræves ingen tidligere erfaring. Go Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.

Hvor lang tid tager lektionen “CORS- og panic recovery-middleware”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Go Academy-lektion?

Ja. Alle Go Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Det grundlæggende i HTTP-middlewarekæder
  2. Logging- og request-ID-middleware
  3. Auth- og rate-limiting-middleware
  4. CORS- og panic recovery-middleware
← Tilbage til Go Academy