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

詳解如何在Golang中實(shí)現(xiàn)CORS(跨域)

 更新時(shí)間:2023年10月17日 08:49:33   作者:jefffff  
很多時(shí)候,需要允許Web應(yīng)用程序在不同域之間(跨域)實(shí)現(xiàn)共享資源,本文將簡(jiǎn)介跨域、CORS的概念,以及如何在Golang中如何實(shí)現(xiàn)CORS,文中有詳細(xì)的示例代碼,需要的朋友可以參考下

什么是跨域

如果兩個(gè) URL 的協(xié)議、端口(如果有指定的話)和主機(jī)都相同的話,則這兩個(gè) URL 是同源的。例如

URL結(jié)果原因
http://store.company.com/dir2/other.html同源只有路徑不同
http://store.company.com/dir/inner/another.html同源只有路徑不同
https://store.company.com/secure.html失敗協(xié)議不同
http://store.company.com:81/dir/etc.html失敗端口不同(http:// 默認(rèn)端口是 80)
http://store.company.com:81/dir/etc.html失敗主機(jī)不同

什么是CORS

跨域資源共享(Cross-origin resource sharing,CORS),用于讓網(wǎng)頁的受限資源能夠被其他域名的頁面訪問的一種機(jī)制。通過該機(jī)制,頁面能夠自由地使用不同源的圖片、樣式、腳本、iframes以及視頻。一些跨域的請(qǐng)求(特別是Ajax)常常會(huì)被同源策略(Same-origin policy)所禁止??缭促Y源共享定義了一種方式,為的是瀏覽器和服務(wù)器之間能互相確認(rèn)是否足夠安全以至于能使用跨源請(qǐng)求(cross-origin requests)。比起純粹的同源請(qǐng)求,這將更為自由和功能性的(functionality),但比純粹的跨源請(qǐng)求更為安全。---維基百科

實(shí)現(xiàn)原理

跨域資源共享標(biāo)準(zhǔn)描述了,新的HTTP頭部在瀏覽器有權(quán)限的時(shí)候,應(yīng)該以如何的形式發(fā)送請(qǐng)求到遠(yuǎn)程URLs。雖然服務(wù)器會(huì)有一些校驗(yàn)和認(rèn)證,但是瀏覽器有責(zé)任去支持這些頭部以及增加相關(guān)的限制。對(duì)于能夠修改數(shù)據(jù)的Ajax和HTTP請(qǐng)求方法(特別是 GET 以外的 HTTP 請(qǐng)求,或者搭配某些 MIME 類型的 POST 請(qǐng)求),瀏覽器必須首先使用 OPTIONS 方法發(fā)起一個(gè)預(yù)檢請(qǐng)求(preflight request),從而獲知服務(wù)端是否允許該跨源請(qǐng)求。服務(wù)器確認(rèn)允許之后,才發(fā)起實(shí)際的 HTTP 請(qǐng)求。在預(yù)檢請(qǐng)求的返回中,服務(wù)器端也可以通知客戶端,是否需要攜帶身份憑證(包括 Cookies 和 HTTP 認(rèn)證相關(guān)數(shù)據(jù))。

Go是如何實(shí)現(xiàn)

在Golang中,可以使用HTTP處理程序和中間件來實(shí)現(xiàn)CORS。接著我們以Gin為例

package main
import (
	"github.com/gin-gonic/gin"
	"net/http"
)
func main() {
	router := gin.Default()
	// CORS中間件
	cors := func(c *gin.Context) {
		// 允許特定的域進(jìn)行跨域請(qǐng)求
		c.Writer.Header().Set("Access-Control-Allow-Origin", "http://mysite.vip")
		// 允許特定的請(qǐng)求方法
		c.Writer.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE")
		// 允許特定的請(qǐng)求頭
		c.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization")
		// 允許攜帶身份憑證(如Cookie)
		c.Writer.Header().Set("Access-Control-Allow-Credentials", "true")
		// 繼續(xù)處理請(qǐng)求
		c.Next()
	}
	// 應(yīng)用CORS中間件到所有路由
	router.Use(cors)
	// 定義一個(gè)路由和處理器函數(shù)
	router.GET("/hello-world", func(c *gin.Context) {
		c.String(http.StatusOK, "Hello, World!")
	})
	router.Run(":8080")
}

輸出

[GIN-debug] GET /hello-world --> main.main.func2 (4 handlers)
[GIN-debug] Listening and serving HTTP on :8080

在上例中,設(shè)置了Access-Control-Allow-Origin響應(yīng)頭,指定允許跨域請(qǐng)求的域名。您可以根據(jù)需要設(shè)置為特定域名、通配符*(允許所有域名)或動(dòng)態(tài)獲取請(qǐng)求頭中的Origin值。另外,還設(shè)置了允許的請(qǐng)求方法、請(qǐng)求頭以及是否允許攜帶身份憑證(如Cookie)。

測(cè)試

這里通過命令行curl來驗(yàn)證,如果返回結(jié)果中出現(xiàn) CORS 相關(guān)的 header( ccess-Control-Allow-Origin: * < Access-Control-Allow-Methods: * < Access-Control-Allow-Headers: * < Access-Control-Expose-Headers: * < Access-Control-Max-Age: 5 ),則跨域成功。結(jié)果如下:

#curl -i -k http://127.0.0.1:8080/hello-world
HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: Content-Type, Authorization
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Origin: http://mysite.vip
Content-Type: text/plain; charset=utf-8
Date: Sat, 14 Oct 2023 13:42:35 GMT
Content-Length: 13
Hello, World!

Success

以上就是詳解如何在Golang中實(shí)現(xiàn)CORS(跨域)的詳細(xì)內(nèi)容,更多關(guān)于Golang實(shí)現(xiàn)CORS的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Golang文件讀寫操作詳情

    Golang文件讀寫操作詳情

    這篇文章主要介紹了Golang文件讀寫操作詳情,文件是數(shù)據(jù)源(保存數(shù)據(jù)的地方)的一種,文件最主要的作用就是保存數(shù)據(jù),文件在程序中是以流的形式來操作的,更多詳細(xì)內(nèi)容需要的朋友可以參考一下
    2022-07-07
  • 一文帶你了解GO語言中方法的應(yīng)用

    一文帶你了解GO語言中方法的應(yīng)用

    GO?語言中的方法實(shí)際上和函數(shù)是類似的,只不過在函數(shù)的基礎(chǔ)上多了一個(gè)參數(shù),這篇文章主要為大家介紹一下GO語言中方法的應(yīng)用,需要的可以參考下
    2023-09-09
  • Golang 斷言與閉包使用解析

    Golang 斷言與閉包使用解析

    這篇文章主要介紹了Golang 斷言與閉包使用解析,Go中的斷言用于判斷變量的類型,更多相關(guān)內(nèi)容需要的朋友可以參考一下
    2022-07-07
  • Golang中crypto/rand庫的使用技巧與最佳實(shí)踐

    Golang中crypto/rand庫的使用技巧與最佳實(shí)踐

    在Golang的眾多隨機(jī)數(shù)生成庫中,crypto/rand?是一個(gè)專為加密安全設(shè)計(jì)的庫,本文主要介紹了Golang中crypto/rand庫的使用技巧與最佳實(shí)踐,感興趣的可以了解一下
    2024-02-02
  • Golang實(shí)現(xiàn)協(xié)程超時(shí)控制的方式總結(jié)

    Golang實(shí)現(xiàn)協(xié)程超時(shí)控制的方式總結(jié)

    我們知道,go協(xié)程如果不做好處理,很容易造成內(nèi)存泄漏,所以對(duì)goroutine做超時(shí)控制,才能有效避免這種情況發(fā)生,本文為大家整理了兩個(gè)常見的Golang超時(shí)控制方法,需要的可以收藏一下
    2023-05-05
  • go中string、int、float相互轉(zhuǎn)換的實(shí)現(xiàn)示例

    go中string、int、float相互轉(zhuǎn)換的實(shí)現(xiàn)示例

    本文主要介紹了go中string、int、float相互轉(zhuǎn)換的實(shí)現(xiàn)示例,文中根據(jù)實(shí)例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Go中http超時(shí)問題的排查及解決方法

    Go中http超時(shí)問題的排查及解決方法

    這篇文章主要介紹了Go中http超時(shí)問題的排查及解決方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-10-10
  • go語言定時(shí)器Timer及Ticker的功能使用示例詳解

    go語言定時(shí)器Timer及Ticker的功能使用示例詳解

    這篇文章主要為大家介紹了go語言定時(shí)器的功能使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • go內(nèi)存緩存BigCache封裝Entry源碼解讀

    go內(nèi)存緩存BigCache封裝Entry源碼解讀

    這篇文章主要為大家介紹了go內(nèi)存緩存BigCache封裝Entry源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • Go?Ginrest實(shí)現(xiàn)一個(gè)RESTful接口

    Go?Ginrest實(shí)現(xiàn)一個(gè)RESTful接口

    這篇文章主要為大家介紹了Go?Ginrest實(shí)現(xiàn)一個(gè)RESTful接口示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08

最新評(píng)論

工布江达县| 白玉县| 仪陇县| 连江县| 远安县| 固始县| 拉萨市| 桃园市| 凌云县| 景德镇市| 武鸣县| 沅江市| 江都市| 侯马市| 凤冈县| 湛江市| 阿拉善盟| 绥滨县| 波密县| 稻城县| 界首市| 绥芬河市| 鹤庆县| 响水县| 个旧市| 安福县| 汪清县| 育儿| 夹江县| 太原市| 嘉祥县| 那曲县| 辽阳县| 孟州市| 大足县| 靖江市| 平安县| 太康县| 贵州省| 延寿县| 漳平市|