cors跨域解决方案 Go?跨域中间件解决CORS问题 cors解决跨域问题
目录
- 什么是跨域(CORS)?
- Go 中怎样处理跨域?
- 一、原生net/http实现 CORS 中间件
- 二、使用 Gin 框架的 CORS 中间件
- 安装依赖:
- 示例代码:
- 跨域处理注意事项
- 写在最终
在开发基于 Web 的 API 时,尤其是前后端分离项目,跨域难题(CORS)是前端开发人员经常遇到的“拦路虎”。这篇文章小编将带你了解什么是跨域、怎样在 Go 中优雅地实现一个跨域中间件,支持你自己的 HTTP 服务或框架如net/http
、Gin
等。
什么是跨域(CORS)?
CORS(Cross-Origin Resource Sharing)是浏览器的一种安全策略,它阻止一个域上的网页向另一个域发起 AJAX 请求。比如,前端运行在http://localhost:3000
,后端运行在http://localhost:8080
,这就属于跨源请求。
为了安全,浏览器默认禁止这种请求,除非后端服务器明确在响应头中声明:我允许这个请求通过。
Go 中怎样处理跨域?
在 Go 中,我们可以通过中间件(middleware)的方式拦截请求,并给响应头添加相关的 CORS 允许字段,从而让浏览器放心通信。
一、原生net/http实现 CORS 中间件
package mainimport ( “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 框架的 CORS 中间件
如果你使用的是 Gin 框架,可以使用官方推荐的github.com/gin-contrib/cors
插件:
安装依赖:
go get github.com/gin-contrib/cors
示例代码:
package mainimport ( “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: &039;include&039;
,后端也要设置AllowCredentials: true
。 - OPTIONS 请求是浏览器自动发送的预检请求,必须返回 200 或 204 情形码。
写在最终
在 Go 项目中实现 CORS 支持并不复杂,只要你领会了浏览器的跨域行为,就可以通过中间件轻松搞定。无论你是用标准库还是 Gin 框架,跨域难题都不再是“魔咒”。
到此这篇关于Go 跨域中间件解决CORS难题的文章就介绍到这了,更多相关Go 跨域中间件 内容请搜索风君子博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持风君子博客!
无论兄弟们可能感兴趣的文章:
- Go中跨域Cors中间件的实现