0Pricing
Go Academy · บทเรียน

มิดเดิลแวร์ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. พื้นฐานสายโซ่มิดเดิลแวร์ HTTP
  2. มิดเดิลแวร์สำหรับการบันทึกและ ID คำขอ
  3. มิดเดิลแวร์การยืนยันตัวตนและจำกัดอัตรา
  4. มิดเดิลแวร์ CORS และกู้คืนจาก panic
← กลับไปที่ Go Academy