最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

全面解析Golang 中的 Gorilla CORS 中間件正確用法

 更新時間:2025年07月30日 11:40:19   作者:gopher.guo  
Golang 中使用 gorilla/mux 路由器配合 rs/cors 中間件庫可以優(yōu)雅地解決這個問題,然而,很多人剛開始使用時會遇到配置不生效的問題,本文將詳細介紹其正確用法,感興趣的朋友一起看看吧

如何讓 Golang 中的 Gorilla CORS 中間件正確工作

在構(gòu)建 RESTful API 時,**跨域資源共享(CORS)**是一個常見問題。前端請求后端接口時,若兩者的域名、端口不同,瀏覽器就會觸發(fā)跨域校驗。若服務(wù)端未配置 CORS 策略,則瀏覽器會阻止請求。

Golang 中使用 gorilla/mux 路由器配合 rs/cors 中間件庫可以優(yōu)雅地解決這個問題。然而,很多人剛開始使用時會遇到配置不生效的問題,本文將詳細介紹其正確用法。

一、基礎(chǔ)依賴

確保安裝以下依賴:

go get -u github.com/gorilla/mux
go get -u github.com/rs/cors

二、錯誤用法(很多人一開始都會這樣寫)

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")
	// ? 錯誤:中間件未被真正使用
	c := cors.New(cors.Options{
		AllowedOrigins: []string{"*"},
	})
	http.ListenAndServe(":8080", router) // 忽略了 cors.Handler
}

雖然寫了 cors.New(...),但實際上并沒有將其作用于 HTTP 服務(wù)器上。這相當(dāng)于創(chuàng)建了一個 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)
}

四、如何驗證是否生效

你可以通過以下方式測試:

  1. 用瀏覽器或 Postman 發(fā)起請求。
  2. 檢查返回的響應(yīng)頭中是否有:
Access-Control-Allow-Origin: *

這說明服務(wù)端已允許跨域請求。

五、常見配置項說明

配置項說明
AllowedOrigins允許的來源,例如:[]string{"http://localhost:3000"}* 表示所有
AllowedMethods支持的方法,如 GET, POST, OPTIONS
AllowedHeaders允許的請求頭,如 Content-Type, Authorization
AllowCredentials是否允許攜帶 cookie

六、OPTIONS 請求的問題

瀏覽器在發(fā)出跨域請求之前,通常會發(fā)出一個 OPTIONS 請求(預(yù)檢)。務(wù)必確保你的路由器或中間件沒有攔截 OPTIONS 請求。

示例:

router.Methods("OPTIONS").HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
	w.WriteHeader(http.StatusOK)
})

不過大多數(shù)時候 rs/cors 會自動處理 OPTIONS 請求,你無需手動添加。

七、小貼士

  • 開發(fā)階段可以設(shè)置 AllowedOrigins: []string{"*"},但生產(chǎn)環(huán)境下應(yīng)限制為指定域名。
  • 確保中間件被正確包裹 router,否則它根本不會生效。
  • 如果你還有認(rèn)證邏輯,確保 cors 中間件放在最外層。

總結(jié)

在 Golang 項目中正確配置 CORS 是 API 可用性的基本要求之一。通過 gorilla/mux 搭配 rs/cors,你可以快速實現(xiàn)跨域支持。記住,最常見的錯誤就是:創(chuàng)建了中間件但沒有包裹 router。只要繞開這個坑,你的跨域請求將順利進行。

原文鏈接:https://duoke360.com/post/44220

到此這篇關(guān)于如何讓 Golang 中的 Gorilla CORS 中間件正確用法的文章就介紹到這了,更多相關(guān)go gorilla cors 中間件用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于Golang標(biāo)準(zhǔn)庫flag的全面講解

    關(guān)于Golang標(biāo)準(zhǔn)庫flag的全面講解

    這篇文章主要介紹了關(guān)于Golang標(biāo)準(zhǔn)庫flag的全面講解,這個庫的代碼量只有1000行左右,卻提供了非常完善的命令行參數(shù)解析功能,更多相關(guān)內(nèi)容需要的朋友可以參考一下
    2022-09-09
  • 深入理解Golang中Context的使用

    深入理解Golang中Context的使用

    本文主要介紹了Golang中Context的使用,特別是cancelCtx的實現(xiàn),通過理解cancelCtx的數(shù)據(jù)結(jié)構(gòu)、掛載機制和取消機制,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-02-02
  • Go語言Time包的具體使用

    Go語言Time包的具體使用

    Go語言中有關(guān)于時間和日期的方法都在time包里面,本文主要介紹了Go語言Time包,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • Golang實踐筆錄之讀取yaml配置文件

    Golang實踐筆錄之讀取yaml配置文件

    YAML是YAML?Ain't?a?Markup?Language的縮寫,YAML不是一種標(biāo)記語言,相比JSON格式的方便,這篇文章主要給大家介紹了關(guān)于Golang實踐筆錄之讀取yaml配置文件的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-01-01
  • 詳解Golang中的交叉編譯

    詳解Golang中的交叉編譯

    在 Golang 中,交叉編譯指的是在同一臺機器上生成針對不同操作系統(tǒng)或硬件架構(gòu)的二進制文件,這在開發(fā)跨平臺應(yīng)用或構(gòu)建特定平臺的發(fā)布版本時非常有用,本文就詳細的給大家介紹一下Golang中的交叉編譯,需要的朋友可以參考下
    2023-08-08
  • Go中Context使用源碼解析

    Go中Context使用源碼解析

    這篇文章主要為大家介紹了Go中Context使用源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • Golang設(shè)計模式之工廠方法模式講解和代碼示例

    Golang設(shè)計模式之工廠方法模式講解和代碼示例

    工廠方法是一種創(chuàng)建型設(shè)計模式, 解決了在不指定具體類的情況下創(chuàng)建產(chǎn)品對象的問題,本文將通過代碼示例詳細給大家介紹一下Golang工廠方法模式,感興趣的同學(xué)可以參考一下
    2023-06-06
  • 深入了解Go語言中database/sql是如何設(shè)計的

    深入了解Go語言中database/sql是如何設(shè)計的

    在?Go?語言中內(nèi)置了?database/sql?包,它只對外暴露了一套統(tǒng)一的編程接口,便可以操作不同數(shù)據(jù)庫,那么database/sql?是如何設(shè)計的呢,下面就來和大家簡單聊聊吧
    2023-07-07
  • 通過案例詳細聊聊Go語言的變量與常量

    通過案例詳細聊聊Go語言的變量與常量

    在任何一門現(xiàn)代的高級語言中,變量和常量都是它非?;A(chǔ)的程序結(jié)構(gòu)的組成部分,下面這篇文章主要給大家介紹了關(guān)于如何通過案例詳細聊聊Go語言的變量與常量的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • golang整合日志zap的實現(xiàn)示例

    golang整合日志zap的實現(xiàn)示例

    Go語言中的zap庫提供了強大的日志管理功能,支持日志記錄到文件、日志切割、多日志級別、結(jié)構(gòu)化日志輸出等,它通過三種方法zap.NewProduction()、zap.NewDevelopment()和zap.NewExample(),快速構(gòu)建適用于不同環(huán)境的logger,感興趣的可以了解一下
    2024-10-10

最新評論

乌拉特前旗| 临清市| 衡南县| 南充市| 通河县| 湖南省| 丽水市| 阿荣旗| 慈利县| 拉孜县| 水城县| 迁安市| 盐山县| 长泰县| 丹东市| 富蕴县| 佛冈县| 宝坻区| 安达市| 五峰| 合水县| 鹤庆县| 利津县| 河南省| 肇庆市| 盐城市| 仁布县| 屏东市| 南召县| 厦门市| 博罗县| 河北省| 瓦房店市| 巴东县| 广南县| 华亭县| 土默特左旗| 长垣县| 金川县| 敖汉旗| 大兴区|