มิดเดิลแวร์ CORS และกู้คืนจาก panic
นโยบายข้ามต้นทางและการกู้คืนจาก panic
มิดเดิลแวร์ CORS และกู้คืนจาก panic เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 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: * เมื่อมีข้อมูลรับรอง เช่น คุกกี้หรือส่วนหัว 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
อนุญาตให้ส่งคุกกี้และส่วนหัว Authorization ข้ามต้นทาง:
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
ส่งแพนิกไปยัง Sentry หรือบริการติดตามข้อผิดพลาดที่คล้ายกันภายในมิดเดิลแวร์กู้คืน ก่อนส่งคืน 500 ให้ไคลเอ็นต์
ลำดับ: 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 ต้องเป็นมิดเดิลแวร์ชั้นนอกสุด
คำถามที่พบบ่อย
บทเรียน “มิดเดิลแวร์ CORS และกู้คืนจาก panic” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “มิดเดิลแวร์ CORS และกู้คืนจาก panic” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “มิดเดิลแวร์ CORS และกู้คืนจาก panic”
นโยบายข้ามต้นทางและการกู้คืนจาก panic คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “มิดเดิลแวร์ CORS และกู้คืนจาก panic” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม
ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- พื้นฐานสายโซ่มิดเดิลแวร์ HTTP
- มิดเดิลแวร์สำหรับการบันทึกและ ID คำขอ
- มิดเดิลแวร์การยืนยันตัวตนและจำกัดอัตรา
- มิดเดิลแวร์ CORS และกู้คืนจาก panic