使用Go语言实现跨域资源共享(CORS)设置

 更新时间:2024年06月05日 10:24:56   作者:程序员墨松  
在Web开发中,跨域资源共享(CORS)是一种重要的安全机制,它允许许多资源在一个网页上被另一个来源的网页所访问,然而,出于安全考虑,浏览器默认禁止这种跨域访问,为了解决这个问题,我们可以使用Go语言来设置CORS,需要的朋友可以参考下

如何使用Go语言进行跨域资源共享(CORS)设置?

在Web开发中,跨域资源共享(CORS)是一种重要的安全机制,它允许许多资源(例如字体、JavaScript等)在一个网页上被另一个来源的网页所访问。然而,出于安全考虑,浏览器默认禁止这种跨域访问。为了解决这个问题,我们可以使用Go语言来设置CORS。

为什么需要设置CORS?

在Web应用中,我们经常会遇到这样的场景:一个网页需要从另一个来源获取资源,例如从CDN加载图片或JavaScript文件,或者从一个API服务获取数据。由于浏览器的同源策略限制,这些跨域请求默认会被阻止。CORS机制就是为了解决这个问题而设计的,它允许服务器明确指示哪些来源的网页可以访问其资源。

如何使用Go语言设置CORS?

在Go语言中,设置CORS通常涉及到在HTTP响应头中设置适当的CORS相关头信息。以下是一个简单的示例,展示了如何在Go的HTTP服务器中设置CORS:

package main

import (
 "fmt"
 "net/http"
)

func corsHandler(w http.ResponseWriter, r *http.Request) {
 // 设置允许跨域访问的来源
 w.Header().Set("Access-Control-Allow-Origin", "*")

 // 设置允许的请求方法
 w.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")

 // 设置允许的请求头
 w.Header().Set("Access-Control-Allow-Headers", "Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization")

 // 预检请求的缓存时间(秒)
 w.Header().Set("Access-Control-Max-Age", "86400")

 // 是否允许携带凭证
 w.Header().Set("Access-Control-Allow-Credentials", "true")

 // 处理实际的请求
 // ...
}

func main() {
 http.HandleFunc("/", corsHandler)
 http.ListenAndServe(":8080", nil)
}

在这个示例中,我们定义了一个corsHandler函数,它会在每个响应中设置CORS相关的头信息。然后,我们将这个函数注册为处理根路径(“/”)的处理器。

  • Access-Control-Allow-Origin:指定哪些来源的网页可以访问该资源。在这个例子中,我们设置为"*",表示允许所有来源的访问。在实际应用中,为了安全起见,你应该明确指定允许访问的来源。
  • Access-Control-Allow-Methods:指定允许的HTTP请求方法,如GET、POST等。
  • Access-Control-Allow-Headers:指定允许的请求头。
  • Access-Control-Max-Age:指定预检请求的缓存时间(以秒为单位)。这可以减少不必要的预检请求。
  • Access-Control-Allow-Credentials:指定是否允许携带凭证(如cookies、HTTP认证等)。

请注意,这只是一个简单的示例,用于说明如何在Go语言中设置CORS。在实际应用中,你可能需要根据具体需求进行更复杂的配置。此外,你还可以考虑使用第三方库(如gorilla/mux、chirouter等)来更方便地管理CORS设置。

拓展知识:Go实现CORS(跨域)

实现原理

跨域资源共享标准描述了,新的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!

到此这篇关于使用Go语言实现跨域资源共享(CORS)设置的文章就介绍到这了,更多相关Go设置CORS内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go 语言数据结构之双链表学习教程

    Go 语言数据结构之双链表学习教程

    这篇文章主要为大家介绍了Go 语言数据结构之双链表学习教程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Golang channel死锁的几种情况小结

    Golang channel死锁的几种情况小结

    本文主要介绍了Golang channel死锁的几种情况小结,详细的介绍了六种情况,具有一定的参考价值,感兴趣的可以了解一下
    2024-08-08
  • Golang处理gRPC请求/响应元数据的示例代码

    Golang处理gRPC请求/响应元数据的示例代码

    前段时间实现内部gRPC框架时,为了实现在服务端拦截器中打印请求及响应的头部信息,便查阅了部分关于元数据的资料,因为中文网络上对于该领域的信息较少,于是在这做了一些简单的总结,需要的朋友可以参考下
    2024-03-03
  • GO语言中常见的排序算法使用示例

    GO语言中常见的排序算法使用示例

    这篇文章主要为大家介绍了GO语言中常见排序算法的使用示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • golang gorm框架数据库的连接操作示例

    golang gorm框架数据库的连接操作示例

    这篇文章主要为大家介绍了golang gorm框架数据库操作示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • go使用SQLX操作MySQL数据库的教程详解

    go使用SQLX操作MySQL数据库的教程详解

    sqlx 是 Go 语言中一个流行的操作数据库的第三方包,它提供了对 Go 标准库 database/sql 的扩展,简化了操作数据库的步骤,下面我们就来学习一下go如何使用SQLX实现MySQL数据库的一些基本操作吧
    2023-11-11
  • Go并发编程结构体多字段原子操作示例详解

    Go并发编程结构体多字段原子操作示例详解

    这篇文章主要为大家介绍了Go并发编程结构体多字段原子操作示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Golang中使用JSON的一些小技巧分享

    Golang中使用JSON的一些小技巧分享

    这篇文章主要分享了Golang中使用JSON的一些小技巧,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-06-06
  • Golang创建第一个web项目(Gin+Gorm)

    Golang创建第一个web项目(Gin+Gorm)

    本文主要介绍了Golang创建第一个web项目(Gin+Gorm),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06
  • Go高级特性探究之稳定排序详解

    Go高级特性探究之稳定排序详解

    Go 语言提供了 sort 包,其中最常用的一种是 sort.Slice() 函数,本篇文章将为大家介绍如何使用 sort.SliceStable() 对结构体数组的某个字段进行稳定排序,感兴趣的可以了解一下
    2023-06-06

最新评论