全面解析Golang 中的 Gorilla CORS 中間件正確用法
如何讓 Golang 中的 Gorilla CORS 中間件正確工作
在構(gòu)建 RESTful API 時(shí),**跨域資源共享(CORS)**是一個(gè)常見問(wèn)題。前端請(qǐng)求后端接口時(shí),若兩者的域名、端口不同,瀏覽器就會(huì)觸發(fā)跨域校驗(yàn)。若服務(wù)端未配置 CORS 策略,則瀏覽器會(huì)阻止請(qǐng)求。
Golang 中使用 gorilla/mux 路由器配合 rs/cors 中間件庫(kù)可以優(yōu)雅地解決這個(gè)問(wèn)題。然而,很多人剛開始使用時(shí)會(huì)遇到配置不生效的問(wèn)題,本文將詳細(xì)介紹其正確用法。
一、基礎(chǔ)依賴
確保安裝以下依賴:
go get -u github.com/gorilla/mux go get -u github.com/rs/cors
二、錯(cuò)誤用法(很多人一開始都會(huì)這樣寫)
package main
import (
"fmt"
"net/http"
"github.com/gorilla/mux"
"github.com/rs/cors"
)
func main() {
router := mux.NewRouter()
router.HandleFunc("/api", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Hello, CORS!")
}).Methods("GET")
// ? 錯(cuò)誤:中間件未被真正使用
c := cors.New(cors.Options{
AllowedOrigins: []string{"*"},
})
http.ListenAndServe(":8080", router) // 忽略了 cors.Handler
}雖然寫了 cors.New(...),但實(shí)際上并沒有將其作用于 HTTP 服務(wù)器上。這相當(dāng)于創(chuàng)建了一個(gè) CORS 配置但未使用。
三、正確用法
你需要將 cors.Handler 包裝你的主路由器:
func main() {
router := mux.NewRouter()
router.HandleFunc("/api", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Hello, CORS!")
}).Methods("GET")
// ? 正確:將 CORS 中間件包裹 router
c := cors.New(cors.Options{
AllowedOrigins: []string{"*"},
AllowedMethods: []string{"GET", "POST", "PUT", "DELETE"},
AllowedHeaders: []string{"Content-Type"},
AllowCredentials: true,
})
handler := c.Handler(router)
http.ListenAndServe(":8080", handler)
}四、如何驗(yàn)證是否生效
你可以通過(guò)以下方式測(cè)試:
- 用瀏覽器或 Postman 發(fā)起請(qǐng)求。
- 檢查返回的響應(yīng)頭中是否有:
Access-Control-Allow-Origin: *
這說(shuō)明服務(wù)端已允許跨域請(qǐng)求。
五、常見配置項(xiàng)說(shuō)明
| 配置項(xiàng) | 說(shuō)明 |
|---|---|
AllowedOrigins | 允許的來(lái)源,例如:[]string{"http://localhost:3000"} 或 * 表示所有 |
AllowedMethods | 支持的方法,如 GET, POST, OPTIONS 等 |
AllowedHeaders | 允許的請(qǐng)求頭,如 Content-Type, Authorization |
AllowCredentials | 是否允許攜帶 cookie |
六、OPTIONS 請(qǐng)求的問(wèn)題
瀏覽器在發(fā)出跨域請(qǐng)求之前,通常會(huì)發(fā)出一個(gè) OPTIONS 請(qǐng)求(預(yù)檢)。務(wù)必確保你的路由器或中間件沒有攔截 OPTIONS 請(qǐng)求。
示例:
router.Methods("OPTIONS").HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
})不過(guò)大多數(shù)時(shí)候 rs/cors 會(huì)自動(dòng)處理 OPTIONS 請(qǐng)求,你無(wú)需手動(dòng)添加。
七、小貼士
- 開發(fā)階段可以設(shè)置
AllowedOrigins: []string{"*"},但生產(chǎn)環(huán)境下應(yīng)限制為指定域名。 - 確保中間件被正確包裹
router,否則它根本不會(huì)生效。 - 如果你還有認(rèn)證邏輯,確保
cors中間件放在最外層。
總結(jié)
在 Golang 項(xiàng)目中正確配置 CORS 是 API 可用性的基本要求之一。通過(guò) gorilla/mux 搭配 rs/cors,你可以快速實(shí)現(xiàn)跨域支持。記住,最常見的錯(cuò)誤就是:創(chuàng)建了中間件但沒有包裹 router。只要繞開這個(gè)坑,你的跨域請(qǐng)求將順利進(jìn)行。
原文鏈接:https://duoke360.com/post/44220
到此這篇關(guān)于如何讓 Golang 中的 Gorilla CORS 中間件正確用法的文章就介紹到這了,更多相關(guān)go gorilla cors 中間件用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang中Map按照Value大小排序的方法實(shí)例
這篇文章主要給大家介紹了關(guān)于Golang中Map按照Value大小排序的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-03-03
Golang實(shí)現(xiàn)支付寶沙箱支付的方法步驟
本文主要介紹了Golang實(shí)現(xiàn)支付寶沙箱支付的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
利用golang和shell計(jì)算一個(gè)字符串的md5值
這篇文章主要介紹了如何利用golang和shell計(jì)算一個(gè)字符串的md5值,我們先用shell來(lái)計(jì)算一下,再去判斷golang計(jì)算的md5值是否正確,文中有詳細(xì)的圖文介紹,需要的朋友可以參考下2024-03-03
Go語(yǔ)言開發(fā)前后端不分離項(xiàng)目詳解
這篇文章主要為大家介紹了Go語(yǔ)言開發(fā)前后端不分離項(xiàng)目詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
詳解Go語(yǔ)言中的數(shù)據(jù)庫(kù)操作
數(shù)據(jù)庫(kù)是應(yīng)用開發(fā)中必須要掌握的技巧。這篇文章主要和大家介紹一下Go語(yǔ)言中相關(guān)的數(shù)據(jù)庫(kù)操作,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-02-02
一文帶你了解Golang中強(qiáng)大的重試機(jī)制
在 Go 語(yǔ)言中,處理瞬態(tài)錯(cuò)誤是常見的挑戰(zhàn),這些錯(cuò)誤可能會(huì)在一段時(shí)間后自動(dòng)恢復(fù),因此,重試機(jī)制在這些情況下非常重要,所以本文就來(lái)和大家聊聊Golang中強(qiáng)大的重試機(jī)制吧2025-01-01

