详解如何在Golang中实现CORS(跨域)

 更新时间:2023年10月17日 08:49:33   作者:jefffff  
很多时候,需要允许Web应用程序在不同域之间(跨域)实现共享资源,本文将简介跨域、CORS的概念,以及如何在Golang中如何实现CORS,文中有详细的示例代码,需要的朋友可以参考下

什么是跨域

如果两个 URL 的协议、端口(如果有指定的话)和主机都相同的话,则这两个 URL 是同源的。例如

URL结果原因
http://store.company.com/dir2/other.html同源只有路径不同
http://store.company.com/dir/inner/another.html同源只有路径不同
https://store.company.com/secure.html失败协议不同
http://store.company.com:81/dir/etc.html失败端口不同(http:// 默认端口是 80)
http://store.company.com:81/dir/etc.html失败主机不同

什么是CORS

跨域资源共享(Cross-origin resource sharing,CORS),用于让网页的受限资源能够被其他域名的页面访问的一种机制。通过该机制,页面能够自由地使用不同源的图片、样式、脚本、iframes以及视频。一些跨域的请求(特别是Ajax)常常会被同源策略(Same-origin policy)所禁止。跨源资源共享定义了一种方式,为的是浏览器和服务器之间能互相确认是否足够安全以至于能使用跨源请求(cross-origin requests)。比起纯粹的同源请求,这将更为自由和功能性的(functionality),但比纯粹的跨源请求更为安全。---维基百科

实现原理

跨域资源共享标准描述了,新的HTTP头部在浏览器有权限的时候,应该以如何的形式发送请求到远程URLs。虽然服务器会有一些校验和认证,但是浏览器有责任去支持这些头部以及增加相关的限制。对于能够修改数据的Ajax和HTTP请求方法(特别是 GET 以外的 HTTP 请求,或者搭配某些 MIME 类型的 POST 请求),浏览器必须首先使用 OPTIONS 方法发起一个预检请求(preflight request),从而获知服务端是否允许该跨源请求。服务器确认允许之后,才发起实际的 HTTP 请求。在预检请求的返回中,服务器端也可以通知客户端,是否需要携带身份凭证(包括 Cookies 和 HTTP 认证相关数据)。

Go是如何实现

在Golang中,可以使用HTTP处理程序和中间件来实现CORS。接着我们以Gin为例

package main
import (
	"github.com/gin-gonic/gin"
	"net/http"
)
func main() {
	router := gin.Default()
	// CORS中间件
	cors := func(c *gin.Context) {
		// 允许特定的域进行跨域请求
		c.Writer.Header().Set("Access-Control-Allow-Origin", "http://mysite.vip")
		// 允许特定的请求方法
		c.Writer.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE")
		// 允许特定的请求头
		c.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization")
		// 允许携带身份凭证(如Cookie)
		c.Writer.Header().Set("Access-Control-Allow-Credentials", "true")
		// 继续处理请求
		c.Next()
	}
	// 应用CORS中间件到所有路由
	router.Use(cors)
	// 定义一个路由和处理器函数
	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

在上例中,设置了Access-Control-Allow-Origin响应头,指定允许跨域请求的域名。您可以根据需要设置为特定域名、通配符*(允许所有域名)或动态获取请求头中的Origin值。另外,还设置了允许的请求方法、请求头以及是否允许携带身份凭证(如Cookie)。

测试

这里通过命令行curl来验证,如果返回结果中出现 CORS 相关的 header( ccess-Control-Allow-Origin: * < Access-Control-Allow-Methods: * < Access-Control-Allow-Headers: * < Access-Control-Expose-Headers: * < Access-Control-Max-Age: 5 ),则跨域成功。结果如下:

#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中实现CORS(跨域)的详细内容,更多关于Golang实现CORS的资料请关注脚本之家其它相关文章!

相关文章

  • golang解析json数据的4种方法总结

    golang解析json数据的4种方法总结

    在日常工作中每一名开发者,不管是前端还是后端,都经常使用 JSON,下面这篇文章主要给大家介绍了关于golang解析json数据的4种方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • Golang连接PostgreSQL基本操作的实现

    Golang连接PostgreSQL基本操作的实现

    PostgreSQL是常见的免费的大型关系型数据库,本文主要介绍了Golang连接PostgreSQL基本操作的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • 解决golang读取http的body时遇到的坑

    解决golang读取http的body时遇到的坑

    这篇文章主要介绍了解决golang读取http的body时遇到的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • golang值接收者和指针接收者的区别介绍

    golang值接收者和指针接收者的区别介绍

    这篇文章主要介绍了golang值接收者和指针接收者的区别,它和函数的区别在于方法有一个接收者,给一个函数添加一个接收者,那么它就变成了方法,接收者可以是值接收者,也可以是指针接收者,本文通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • 详解使用Go添加Nginx代理的方法示例

    详解使用Go添加Nginx代理的方法示例

    这篇文章主要介绍了详解使用Go添加Nginx代理的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • 详解如何在Golang中监听多个channel

    详解如何在Golang中监听多个channel

    这篇文章主要为大家详细介绍了如何在Golang中实现监听多个channel,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-03-03
  • 提升Golang应用性能:深入理解Context的应用

    提升Golang应用性能:深入理解Context的应用

    本文将深入探讨如何通过深入理解和正确应用Go语言中的Context来提升应用性能。需要的朋友可以参考下
    2023-09-09
  • 在Go中使用JSON(附demo)

    在Go中使用JSON(附demo)

    Go开发人员经常需要处理JSON内容,本文主要介绍了在Go中使用JSON,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Golang为什么占用那么多的虚拟内存原理解析

    Golang为什么占用那么多的虚拟内存原理解析

    这篇文章主要介绍了Golang为什么占用那么多的虚拟内存原理解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • GoLang中的sync包Once使用执行示例

    GoLang中的sync包Once使用执行示例

    这篇文章主要介绍了GoLang中的sync包Once使用执行示例,没有学习Once前,大家可能想到 声明一个标识,表示是否初始化过,然后初始化这个标识加锁,更新这个标识,Once包主要用于在并发执行代码的时候,某部分代码只会被执行一次
    2023-03-03

最新评论