欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go?跨域中間件解決CORS問題

 更新時(shí)間:2025年04月22日 10:47:50   作者:程序員愛釣魚  
跨域問題CORS是前端開發(fā)人員經(jīng)常遇到的問題,本文主要介紹了Go?跨域中間件解決CORS問題,具有一定的參考價(jià)值,感興趣的可以了解一下

在開發(fā)基于 Web 的 API 時(shí),尤其是前后端分離項(xiàng)目,**跨域問題(CORS)**是前端開發(fā)人員經(jīng)常遇到的“攔路虎”。本文將帶你了解什么是跨域、如何在 Go 中優(yōu)雅地實(shí)現(xiàn)一個(gè)跨域中間件,支持你自己的 HTTP 服務(wù)或框架如 net/http、Gin 等。

什么是跨域(CORS)?

CORS(Cross-Origin Resource Sharing)是瀏覽器的一種安全策略,它阻止一個(gè)域上的網(wǎng)頁(yè)向另一個(gè)域發(fā)起 AJAX 請(qǐng)求。比如,前端運(yùn)行在 http://localhost:3000,后端運(yùn)行在 http://localhost:8080,這就屬于跨源請(qǐng)求。

為了安全,瀏覽器默認(rèn)禁止這種請(qǐng)求,除非后端服務(wù)器明確在響應(yīng)頭中聲明:我允許這個(gè)請(qǐng)求通過(guò)

Go 中如何處理跨域?

在 Go 中,我們可以通過(guò)**中間件(middleware)**的方式攔截請(qǐng)求,并給響應(yīng)頭添加相關(guān)的 CORS 允許字段,從而讓瀏覽器放心通信。

一、原生 net/http 實(shí)現(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", "*") // 允許所有來(lái)源
        w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
        w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization")

        // 如果是預(yù)檢請(qǐng)求,直接返回
        if r.Method == "OPTIONS" {
            w.WriteHeader(http.StatusNoContent)
            return
        }

        // 繼續(xù)處理請(qǐng)求
        next.ServeHTTP(w, r)
    })
}

支持基本的 GET、POST 請(qǐng)求,并處理了瀏覽器的 預(yù)檢請(qǐng)求(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è)置特定來(lái)源、暴露字段、是否攜帶 cookie 等。

小結(jié)

方式特點(diǎn)
原生 net/http靈活輕便,但需要手動(dòng)設(shè)置和維護(hù)響應(yīng)頭
使用 Gin 插件配置方便,支持更多高級(jí)選項(xiàng),如 credentials、緩存等

跨域處理注意事項(xiàng)

  • 開發(fā)環(huán)境可以設(shè)置 * 允許所有源,但生產(chǎn)環(huán)境請(qǐng)限制具體域名,避免安全風(fēng)險(xiǎn)。
  • 前端使用 fetch 時(shí),若要攜帶 Cookie,需要設(shè)置 credentials: 'include',后端也要設(shè)置 AllowCredentials: true。
  • OPTIONS 請(qǐng)求是瀏覽器自動(dòng)發(fā)送的預(yù)檢請(qǐng)求,必須返回 200 或 204 狀態(tài)碼。

寫在最后

在 Go 項(xiàng)目中實(shí)現(xiàn) CORS 支持并不復(fù)雜,只要你理解了瀏覽器的跨域行為,就可以通過(guò)中間件輕松搞定。無(wú)論你是用標(biāo)準(zhǔn)庫(kù)還是 Gin 框架,跨域問題都不再是“魔咒”。

到此這篇關(guān)于Go 跨域中間件解決CORS問題的文章就介紹到這了,更多相關(guān)Go 跨域中間件 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang 中string和int類型相互轉(zhuǎn)換

    golang 中string和int類型相互轉(zhuǎn)換

    這篇文章主要介紹了golang 中string和int類型相互轉(zhuǎn)換,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Go語(yǔ)言中的格式化輸出占位符的用法詳解

    Go語(yǔ)言中的格式化輸出占位符的用法詳解

    在 Go 語(yǔ)言中,格式化輸出是一個(gè)非常常用的功能,特別是在處理字符串、數(shù)字和其他數(shù)據(jù)類型時(shí),本文將詳細(xì)介紹 Go 語(yǔ)言中常用的格式化占位符及其用法,希望對(duì)大家有所幫助
    2024-10-10
  • Golang 利用反射對(duì)結(jié)構(gòu)體優(yōu)雅排序的操作方法

    Golang 利用反射對(duì)結(jié)構(gòu)體優(yōu)雅排序的操作方法

    這篇文章主要介紹了Golang 利用反射對(duì)結(jié)構(gòu)體優(yōu)雅排序的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-10-10
  • Go Java算法之同構(gòu)字符串示例詳解

    Go Java算法之同構(gòu)字符串示例詳解

    這篇文章主要為大家介紹了Go Java算法之同構(gòu)字符串示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Go微服務(wù)項(xiàng)目配置文件的定義和讀取示例詳解

    Go微服務(wù)項(xiàng)目配置文件的定義和讀取示例詳解

    這篇文章主要為大家介紹了Go微服務(wù)項(xiàng)目配置文件的定義和讀取示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Go語(yǔ)言處理超大字符串型整數(shù)加減經(jīng)典面試詳解

    Go語(yǔ)言處理超大字符串型整數(shù)加減經(jīng)典面試詳解

    這篇文章主要為大家介紹了Go語(yǔ)言處理超大字符串型整數(shù)加減經(jīng)典面試示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • 詳解Go語(yǔ)言中的監(jiān)視器模式與配置熱更新

    詳解Go語(yǔ)言中的監(jiān)視器模式與配置熱更新

    這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言中的監(jiān)視器模式與配置熱更新的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • GO中對(duì)map排序的實(shí)現(xiàn)

    GO中對(duì)map排序的實(shí)現(xiàn)

    本文主要介紹了GO中對(duì)map排序的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • 4個(gè)場(chǎng)景教會(huì)你Go中Goroutine和通道是怎么用的

    4個(gè)場(chǎng)景教會(huì)你Go中Goroutine和通道是怎么用的

    本篇給出了4個(gè)在運(yùn)維開發(fā)工作中較為常見的且也是比較典型的場(chǎng)景,通過(guò)這些場(chǎng)景來(lái)帶大家掌握Go中Goroutine和通道是怎么使用的,需要的可以學(xué)習(xí)一下
    2023-05-05
  • Apache?IoTDB開發(fā)系統(tǒng)之Go原生接口方法

    Apache?IoTDB開發(fā)系統(tǒng)之Go原生接口方法

    這篇文章主要為大家介紹了?Apache?IoTDB開發(fā)系統(tǒng)之Go原生接口方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09

最新評(píng)論