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

Go中跨域Cors中間件的實現(xiàn)

 更新時間:2023年06月07日 11:46:54   作者:王也枉不了  
本文主要介紹了Go中跨域Cors中間件的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

通過建造者模式創(chuàng)建我們的跨域中間件Cors

我們了解到,當使用XMLHttpRequest發(fā)送請求時,如果瀏覽器發(fā)現(xiàn)違反了同源策略就會自動加上一個請求頭 origin;

后端在接受到請求后確定響應后會在 Response Headers 中加入一個屬性 Access-Control-Allow-Origin;

瀏覽器判斷響應中的 Access-Control-Allow-Origin 值是否和當前的地址相同,匹配成功后才繼續(xù)響應處理,否則報錯

缺點:忽略 cookie,瀏覽器版本有一定要求

同時,結合項目實際,我們可以使用一個config結構體來存放我們的配置,這里可以使用建造者模式進行靈活的管理
所以cors中,我們也添加與config相同的字段
Config:

// CorsConfig 使用了建造者模式
type CorsConfig struct {
	AllowOrigins []string
	AllowMethods []string
	AllowHeaders []string
	//如果想要讓客戶端可以訪問到其他的標頭,服務器必須將它們在 Access-Control-Expose-Headers 里面列出來.eg:"Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers,Cache-Control,Content-Language,Content-Type,Expires
	ExposeHeaders []string
	//這個響應頭表示 preflight request (預檢請求)的返回結果(即 Access-Control-Allow-Methods 和Access-Control-Allow-Headers 提供的信息)可以被緩存多久。
	AccessControlMaxAge string
	//告知瀏覽器是否可以將對請求的響應暴露給前端 JavaScript 代碼。
	AccessControlAllowCredentials bool
}

Cors:

type Cors struct {
AllowOrigins []string
AllowMethods []string
AllowHeaders []string
//如果想要讓客戶端可以訪問到其他的標頭,服務器必須將它們在 Access-Control-Expose-Headers 里面列出來.eg:"Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers,Cache-Control,Content-Language,Content-Type,Expires
ExposeHeaders []string
//這個響應頭表示 preflight request (預檢請求)的返回結果(即 Access-Control-Allow-Methods 和Access-Control-Allow-Headers 提供的信息)可以被緩存多久。
AccessControlMaxAge string
//告知瀏覽器是否可以將對請求的響應暴露給前端 JavaScript 代碼。
AccessControlAllowCredentials bool
}

當然,我們的Config需要一些方法來控制字段的值

func (c *CorsConfig) AddOrigins(origins ...string) *CorsConfig {
   c.AllowOrigins = append(c.AllowOrigins, origins...)
   return c
}
func (c *CorsConfig) AddMethods(methods ...string) *CorsConfig {
   c.AllowMethods = append(c.AllowMethods, methods...)
   return c
}
func (c *CorsConfig) AddHeaders(headers ...string) *CorsConfig {
   c.AllowHeaders = append(c.AllowHeaders, headers...)
   return c
}
func (c *CorsConfig) AddExposeHeaders(exposeHeaders ...string) *CorsConfig {
   c.ExposeHeaders = append(c.ExposeHeaders, exposeHeaders...)
   return c
}
func (c *CorsConfig) SetAccessControlMaxAge(ms string) *CorsConfig {
   c.AccessControlMaxAge = ms
   return c
}
func (c *CorsConfig) SetAccessControlAllowCredentials(isAllow bool) *CorsConfig {
   c.AccessControlAllowCredentials = isAllow
   return c
}

同時,為了方便,我們可以給出一個方法來設置默認的情況

func DefaultCorsConfig() *CorsConfig {
   return &CorsConfig{
   	AllowOrigins:                  []string{"*"},
   	AllowMethods:                  []string{"POST", "POST", "GET", "OPTIONS", "PUT", "DELETE", "UPDATE"},
   	AllowHeaders:                  []string{"Authorization", "Content-Length", "X-CSRF-Token", "Token", "session", "X_Requested_With", "Accept", "Origin", "Host", "Connection", "Accept-Encoding", "Accept-Language", "DNT", "X-CustomHeader", "Keep-Alive", "User-Agent", "X-Requested-With", "If-Modified-Since", "Cache-Control", "Content-Type", "Pragma"},
   	ExposeHeaders:                 []string{"Content-Length", "Access-Control-Allow-Origin", "Access-Control-Allow-Headers", "Cache-Control", "Content-Languge", "Caontent-Type", "Expires", "Last-Modified", "Pragma", "FooBar"},
   	AccessControlMaxAge:           "200000",
   	AccessControlAllowCredentials: true,
   }
}

最后,實現(xiàn)將config應用到Cors中的方法和應用Cors的設置的方法
將config應用到Cors中的方法:

func (cors *Cors) SetCorsConfig(c *CorsConfig) {
   cors.AccessControlMaxAge = c.AccessControlMaxAge
   cors.ExposeHeaders = c.ExposeHeaders
   cors.AllowOrigins = c.AllowOrigins
   cors.AllowHeaders = c.AllowHeaders
   cors.AllowMethods = c.AllowMethods
   cors.AccessControlAllowCredentials = c.AccessControlAllowCredentials
}

應用Cors的設置的方法 :

func (cors *Cors) Apply() sgin8.HandlerFunc {
   return func(context *sgin8.Context) {
   	method := context.Req.Method
   	origin := context.Req.Header.Get("Origin")
   	if origin != "" {
   		context.SetHeader("Access-Control-Allow-Origin", strings.Join(cors.AllowOrigins, ",")) // 設置允許訪問所有域
   		context.SetHeader("Access-Control-Allow-Methods", strings.Join(cors.AllowMethods, ","))
   		context.SetHeader("Access-Control-Allow-Headers", strings.Join(cors.AllowHeaders, ","))
   		context.SetHeader("Access-Control-Expose-Headers", strings.Join(cors.ExposeHeaders, ","))
   		context.SetHeader("Access-Control-Max-Age", cors.AccessControlMaxAge)
   		context.SetHeader("Access-Control-Allow-Credentials", strconv.FormatBool(cors.AccessControlAllowCredentials))
   	} else {
   		log.Printf("This request haven not set the 'Origin' in Header")
   	}
   	if method == "OPTIONS" {
   		context.JSON(http.StatusOK, "Options Request!")
   	}
   	//處理請求
   	context.Next()
   }
}

當然,我們提供快速開始的方案:

func (c *CorsConfig) Build() sgin8.HandlerFunc {
	cors := &Cors{}
	cors.SetCorsConfig(c)
	return cors.Apply()
}

demo:

func main() {
	//eg1:
	r := sgin8.Default()
	config1 := sgin8.DefaultCorsConfig()
	cors1 := sgin8.Cors{}
	cors1.SetCorsConfig(config1)
	r.Use(cors1.Apply())
	//eg2
	r.Use(sgin8.DefaultCorsConfig().Build())
	//eg3
	config3 := sgin8.CorsConfig{}
	config3.SetAccessControlMaxAge("200000").SetAccessControlAllowCredentials(true).AddMethods("GET", "POST")
	r.Use(config3.Build())
	//eg4
	config4 := &sgin8.CorsConfig{}
	config4.SetAccessControlMaxAge("200000").SetAccessControlAllowCredentials(true).AddMethods("GET", "POST")
	cors4 := sgin8.Cors{}
	cors4.SetCorsConfig(config4)
	cors4.Apply()
	r.GET("/", func(c *sgin8.Context) {
		c.String(http.StatusOK, "Hello wxk\n")
	})
	// index out of range for testing Recovery()
	r.GET("/panic", func(c *sgin8.Context) {
		names := []string{"wxk"}
		c.String(http.StatusOK, names[100]) //訪問不到
	})
	r.Run(":9999")
}

你也許會問為什么實現(xiàn)的這么繁瑣,那么下文將會解釋下原因!

外鏈:http://www.fzitv.net/article/237709.htm

跨域測試:

失敗情況:

失敗情況

成功情況!

成功情況!

到此這篇關于Go中跨域Cors中間件的實現(xiàn)的文章就介紹到這了,更多相關Go跨域Cors中間件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • golang grpc 負載均衡的方法

    golang grpc 負載均衡的方法

    這篇文章主要介紹了golang grpc 負載均衡的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • Go語言Gin框架中使用MySQL數(shù)據(jù)庫的三種方式

    Go語言Gin框架中使用MySQL數(shù)據(jù)庫的三種方式

    本文主要介紹了Go語言Gin框架中使用MySQL數(shù)據(jù)庫的三種方式,通過三種方式實現(xiàn)增刪改查的操作,具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • Golang無限緩存channel的設計與實現(xiàn)解析

    Golang無限緩存channel的設計與實現(xiàn)解析

    這篇文章主要為大家介紹了Golang無限緩存channel的設計與實現(xiàn)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • Golang?channel為什么不會阻塞的原因詳解

    Golang?channel為什么不會阻塞的原因詳解

    這篇文章主要為大家介紹了Golang?channel為什么不會阻塞的原因詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • Golang多模塊開發(fā)的詳細過程

    Golang多模塊開發(fā)的詳細過程

    這篇文章主要給大家介紹了關于Golang多模塊開發(fā)的詳細過程,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2023-02-02
  • Golang HTTP 服務平滑重啟及升級的思路

    Golang HTTP 服務平滑重啟及升級的思路

    Golang HTTP服務在上線時,需要重新編譯可執(zhí)行文件,關閉正在運行的進程,然后再啟動新的運行進程。這篇文章主要介紹了Golang HTTP 服務平滑重啟及升級,需要的朋友可以參考下
    2020-04-04
  • gorm FirstOrCreate和受影響的行數(shù)實例

    gorm FirstOrCreate和受影響的行數(shù)實例

    這篇文章主要介紹了gorm FirstOrCreate和受影響的行數(shù)實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Golang實踐之Error創(chuàng)建和處理詳解

    Golang實踐之Error創(chuàng)建和處理詳解

    在 C#、Java 等語言中常常使用 try...catch的方式來捕獲異常,但是在Golang 對于錯誤處理有不同的方式,像網(wǎng)上也有很多對 error 處理的最佳實踐的文章,其中很多其實就是對 error 的統(tǒng)一封裝,使用規(guī)范進行約束,本文主要是記錄自己對處理 Error 的一些認識和學習
    2023-09-09
  • golang 如何獲取map所有key的方式

    golang 如何獲取map所有key的方式

    這篇文章主要介紹了golang 獲取map所有key的方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Go并發(fā)編程避坑指南之如何徹底解決死鎖Deadlock問題

    Go并發(fā)編程避坑指南之如何徹底解決死鎖Deadlock問題

    在Go語言的并發(fā)編程中,死鎖(Deadlock)是一種極其隱蔽且致命的錯誤,本文將帶你深入剖析死鎖的成因,并結合 sync 包與 context 包,提供一套行之有效的解決方案,希望對大家有所幫助
    2026-04-04

最新評論

鄂尔多斯市| 都安| 赞皇县| 阳信县| 普兰县| 平阳县| 普兰店市| 临清市| 清流县| 万盛区| 新巴尔虎左旗| 瑞安市| 昭觉县| 徐州市| 宁陵县| 临夏县| 伊宁县| 黄平县| 贡觉县| 莎车县| 班玛县| 武乡县| 弥勒县| 清远市| 岳池县| 丰顺县| 谢通门县| 行唐县| 高碑店市| 盐池县| 顺平县| 榆中县| 高陵县| 格尔木市| 康乐县| 黄冈市| 林州市| 临澧县| 崇仁县| 蛟河市| 朝阳区|