Go?跨域中間件解決CORS問題
在開發(fā)基于 Web 的 API 時,尤其是前后端分離項目,**跨域問題(CORS)**是前端開發(fā)人員經(jīng)常遇到的“攔路虎”。本文將帶你了解什么是跨域、如何在 Go 中優(yōu)雅地實現(xiàn)一個跨域中間件,支持你自己的 HTTP 服務(wù)或框架如 net/http
、Gin
等。
什么是跨域(CORS)?
CORS(Cross-Origin Resource Sharing)是瀏覽器的一種安全策略,它阻止一個域上的網(wǎng)頁向另一個域發(fā)起 AJAX 請求。比如,前端運行在 http://localhost:3000
,后端運行在 http://localhost:8080
,這就屬于跨源請求。
為了安全,瀏覽器默認(rèn)禁止這種請求,除非后端服務(wù)器明確在響應(yīng)頭中聲明:我允許這個請求通過。
Go 中如何處理跨域?
在 Go 中,我們可以通過**中間件(middleware)**的方式攔截請求,并給響應(yīng)頭添加相關(guān)的 CORS 允許字段,從而讓瀏覽器放心通信。
一、原生 net/http 實現(xiàn) CORS 中間件
package main import ( "fmt" "net/http" ) func main() { http.Handle("/", corsMiddleware(http.HandlerFunc(indexHandler))) http.ListenAndServe(":8080", nil) } func indexHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintln(w, "Hello from Go Backend") } func corsMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // 設(shè)置 CORS 響應(yīng)頭 w.Header().Set("Access-Control-Allow-Origin", "*") // 允許所有來源 w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS") w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization") // 如果是預(yù)檢請求,直接返回 if r.Method == "OPTIONS" { w.WriteHeader(http.StatusNoContent) return } // 繼續(xù)處理請求 next.ServeHTTP(w, r) }) }
支持基本的 GET、POST 請求,并處理了瀏覽器的 預(yù)檢請求(OPTIONS)。
二、使用 Gin 框架的 CORS 中間件
如果你使用的是 Gin 框架,可以使用官方推薦的 github.com/gin-contrib/cors
插件:
安裝依賴:
go get github.com/gin-contrib/cors
示例代碼:
package main import ( "github.com/gin-contrib/cors" "github.com/gin-gonic/gin" "time" ) func main() { r := gin.Default() // 使用 cors 中間件 r.Use(cors.New(cors.Config{ AllowOrigins: []string{"http://localhost:3000"}, // 只允許特定域名 AllowMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}, AllowHeaders: []string{"Origin", "Content-Type", "Authorization"}, ExposeHeaders: []string{"Content-Length"}, AllowCredentials: true, MaxAge: 12 * time.Hour, })) r.GET("/", func(c *gin.Context) { c.JSON(200, gin.H{"message": "Hello from Gin!"}) }) r.Run(":8080") }
更靈活配置,可以設(shè)置特定來源、暴露字段、是否攜帶 cookie 等。
小結(jié)
方式 | 特點 |
原生 net/http | 靈活輕便,但需要手動設(shè)置和維護響應(yīng)頭 |
使用 Gin 插件 | 配置方便,支持更多高級選項,如 credentials、緩存等 |
跨域處理注意事項
- 開發(fā)環(huán)境可以設(shè)置
*
允許所有源,但生產(chǎn)環(huán)境請限制具體域名,避免安全風(fēng)險。 - 前端使用
fetch
時,若要攜帶 Cookie,需要設(shè)置credentials: 'include'
,后端也要設(shè)置AllowCredentials: true
。 - OPTIONS 請求是瀏覽器自動發(fā)送的預(yù)檢請求,必須返回 200 或 204 狀態(tài)碼。
寫在最后
在 Go 項目中實現(xiàn) CORS 支持并不復(fù)雜,只要你理解了瀏覽器的跨域行為,就可以通過中間件輕松搞定。無論你是用標(biāo)準(zhǔn)庫還是 Gin 框架,跨域問題都不再是“魔咒”。
到此這篇關(guān)于Go 跨域中間件解決CORS問題的文章就介紹到這了,更多相關(guān)Go 跨域中間件 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
golang 中string和int類型相互轉(zhuǎn)換
這篇文章主要介紹了golang 中string和int類型相互轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02Golang 利用反射對結(jié)構(gòu)體優(yōu)雅排序的操作方法
這篇文章主要介紹了Golang 利用反射對結(jié)構(gòu)體優(yōu)雅排序的操作方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-10-10Go語言處理超大字符串型整數(shù)加減經(jīng)典面試詳解
這篇文章主要為大家介紹了Go語言處理超大字符串型整數(shù)加減經(jīng)典面試示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10Apache?IoTDB開發(fā)系統(tǒng)之Go原生接口方法
這篇文章主要為大家介紹了?Apache?IoTDB開發(fā)系統(tǒng)之Go原生接口方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09