Middleware CORS dan Pemulihan dari Panic
Kebijakan lintas asal dan pemulihan dari panic
Middleware CORS dan Pemulihan dari Panic adalah pelajaran Go Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Go Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Go Academy mencakup 4 pelajaran total.
Apa itu CORS?
Cross-Origin Resource Sharing (CORS) adalah mekanisme keamanan peramban yang membatasi asal mana yang dapat membuat permintaan HTTP ke API Anda. Server mengaktifkannya dengan menetapkan header respons.
Permintaan pendahuluan CORS
Sebelum permintaan lintas asal dengan header khusus atau metode yang tidak sederhana, peramban mengirim permintaan OPTIONS pendahuluan. Perangkat tengah Anda harus menangani OPTIONS dan mengembalikan 200 dengan header CORS.
Perangkat tengah CORS
Perangkat tengah CORS sederhana untuk pengembangan:
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)
})
}Asal yang diizinkan
Jangan gunakan Access-Control-Allow-Origin: * ketika kredensial (cookie, header Authorization) terlibat — gunakan asal yang eksplisit. Lakukan pemeriksaan terhadap daftar izin untuk beberapa asal.
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
Izinkan cookie dan header otorisasi dikirim lintas asal:
w.Header().Set("Access-Control-Allow-Credentials", "true")Pustaka rs/cors
Gunakan pustaka github.com/rs/cors untuk CORS siap produksi dengan pencocokan asal yang fleksibel, dukungan kredensial, dan penyimpanan cache permintaan pendahuluan.
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)Perangkat tengah pemulihan panic
Pulihkan dari panic untuk mencegah server mogok dan kehilangan semua koneksi aktif:
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
Cetak jejak tumpukan goroutine lengkap ketika terjadi panic untuk membantu mendiagnosis akar masalah:
import "runtime/debug"
log.Printf("panic: %v\n%s", rec, debug.Stack())Integrasi Sentry
Kirim panic ke Sentry atau layanan pelacakan kesalahan serupa di dalam perangkat tengah pemulihan sebelum mengembalikan 500 kepada klien.
Urutan: Recovery paling luar
Selalu daftarkan Recovery sebagai perangkat tengah paling luar (yang diterapkan pertama) agar dapat menangkap panic dari semua perangkat tengah dan penangan lainnya.
handler := Recovery(RequestID(Logger(Auth(mux))))Pengujian pemulihan panic
Tulis penangan yang sengaja memicu panic, panggil melalui perangkat tengah dalam httptest, lalu pastikan responsnya adalah 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)Pemeriksaan Singkat
Mengapa perangkat tengah pemulihan panic harus menjadi lapisan paling luar?
Ringkasan: CORS dan Pemulihan Panic
Poin-poin penting:
- CORS: tetapkan header Access-Control-Allow-*; tangani permintaan pendahuluan OPTIONS
- Allow-Origin: gunakan asal eksplisit (bukan *) ketika kredensial terlibat
- Recovery: defer recover() + catat jejak tumpukan + kembalikan 500
- Recovery harus menjadi perangkat tengah paling luar
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Middleware CORS dan Pemulihan dari Panic” gratis?
Ya — teks lengkap “Middleware CORS dan Pemulihan dari Panic” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Go Academy, upgrade ke CoddyKit PRO. Kursus Go Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Middleware CORS dan Pemulihan dari Panic”?
Kebijakan lintas asal dan pemulihan dari panic Kamu berlatih Go Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Go Academy?
Tidak diperlukan pengalaman sebelumnya. Go Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Middleware CORS dan Pemulihan dari Panic” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Go Academy ini?
Ya. Setiap pelajaran Go Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Dasar-Dasar Rantai Middleware HTTP
- Middleware Logging dan ID Permintaan
- Middleware Autentikasi dan Pembatasan Laju
- Middleware CORS dan Pemulihan dari Panic