Go 跨域中间件解决CORS问题

Written by

in

文章目录
  • CORS(Cross-Origin Resource Sharing)是浏览器的一种安全策略,它阻止一个域上的网页向另一个域发起 AJAX 请求。比如,前端运行在 http://localhost:3000,后端运行在 http://localhost:8080,这就属于跨源请求。 为了安全,浏览器默认禁止这种请求,除非后端服务器明确在响应头中声明:我允许这个请求通过。
  • 在 Go 中,我们可以通过**中间件(middleware)**的方式拦截请求,并给响应头添加相关的 CORS 允许字段,从而让浏览器放心通信。
  • 如果你使用的是 Gin 框架,可以使用官方推荐的 github.com/gin-contrib/cors 插件:
  • 方式 特点 原生 net/http 灵活轻便,但需要手动设置和维护响应头 使用 Gin 插件 配置方便,支持更多高级选项,如 credentials、缓存等
  • 开发环境可以设置 * 允许所有源,但生产环境请限制具体域名,避免安全风险。 前端使用 fetch 时,若要携带 Cookie,需要设置 credentials: 'include',后端也要设置 AllowCredentials: true。 OPTIONS 请求是浏览器自动发送的预检请求,必须返回 200 或 204 状态码。
  • 在 Go 项目中实现 CORS 支持并不复杂,只要你理解了浏览器的跨域行为,就可以通过中间件轻松搞定。无论你是用标准库还是 Gin 框架,跨域问题都不再是“魔咒”。 到此这篇关于Go 跨域中间件解决CORS问题的文章就介绍到这了,更多相关Go 跨域中间件 内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客! 您可能感兴趣的文章: Go中跨域Cors中间件的实现
  • 目录
    • 什么是跨域(CORS)?
    • Go 中如何处理跨域?
      • 一、原生 net/http 实现 CORS 中间件
    • 二、使用 Gin 框架的 CORS 中间件
      • 安装依赖:
      • 示例代码:
    • 小结
      • 跨域处理注意事项
        • 写在最后

          在开发基于 Web 的 API 时,尤其是前后端分离项目,**跨域问题(CORS)**是前端开发人员经常遇到的“拦路虎”。本文将带你了解什么是跨域、如何在 Go 中优雅地实现一个跨域中间件,支持你自己的 HTTP 服务或框架如 net/httpGin 等。

          CORS(Cross-Origin Resource Sharing)是浏览器的一种安全策略,它阻止一个域上的网页向另一个域发起 AJAX 请求。比如,前端运行在 http://localhost:3000,后端运行在 http://localhost:8080,这就属于跨源请求。

          为了安全,浏览器默认禁止这种请求,除非后端服务器明确在响应头中声明:我允许这个请求通过

          在 Go 中,我们可以通过**中间件(middleware)**的方式拦截请求,并给响应头添加相关的 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) {
                  // 设置 CORS 响应头
                  w.Header().Set("Access-Control-Allow-Origin", "*") // 允许所有来源
                  w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
                  w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization")
          
                  // 如果是预检请求,直接返回
                  if r.Method == "OPTIONS" {
                      w.WriteHeader(http.StatusNoContent)
                      return
                  }
          
                  // 继续处理请求
                  next.ServeHTTP(w, r)
              })
          }

          支持基本的 GET、POST 请求,并处理了浏览器的 预检请求(OPTIONS)

          如果你使用的是 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")
          }

          更灵活配置,可以设置特定来源、暴露字段、是否携带 cookie 等。

          方式 特点
          原生 net/http 灵活轻便,但需要手动设置和维护响应头
          使用 Gin 插件 配置方便,支持更多高级选项,如 credentials、缓存等

          • 开发环境可以设置 * 允许所有源,但生产环境请限制具体域名,避免安全风险。
          • 前端使用 fetch 时,若要携带 Cookie,需要设置 credentials: 'include',后端也要设置 AllowCredentials: true
          • OPTIONS 请求是浏览器自动发送的预检请求,必须返回 200 或 204 状态码。

          在 Go 项目中实现 CORS 支持并不复杂,只要你理解了浏览器的跨域行为,就可以通过中间件轻松搞定。无论你是用标准库还是 Gin 框架,跨域问题都不再是“魔咒”。

          到此这篇关于Go 跨域中间件解决CORS问题的文章就介绍到这了,更多相关Go 跨域中间件 内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!

          您可能感兴趣的文章:

          • Go中跨域Cors中间件的实现

          站内搜索