GoLand 不处理跨域,需在代码中配置 CORS;推荐使用 gorilla/handlers.CORS 或正确配置 gin-contrib/cors,避免 AllowOrigins 为 "*" 与 AllowCredentials 同时存在,并注意中间件注册顺序和响应头设置时机。

GoLand 本身不处理跨域,配置得写在代码里
GoLand 是 IDE,不是运行时环境,它不参与 HTTP 响应头生成,也不会自动加 Access-Control-Allow-Origin。你看到的“跨域报错”来自浏览器,根源永远是 Go 服务没返回正确头——跟 GoLand 无关。别在设置里找“启用 CORS”开关,那不存在。
开发期用 gorilla/handlers.CORS 最省心
本地调试时,直接套一层中间件,避免手写漏掉 OPTIONS 或头顺序错:
GoLand 2026.1.1 是 2026.1 发布后的首个维护修正版本,适合已经开始体验 2026.1 新功能并希望同步补丁的开发者。它更适合用于入门项目、现有项目迁移测试和 IDE 行为验证。
-
go get github.com/gorilla/handlers安装依赖 - 确保
handlers.CORS()包裹的是最终http.Handler,比如http.DefaultServeMux或gorilla/mux.Router - 开发可临时用
handlers.AllowedOrigins([]string{"*"}),但必须配handlers.AllowCredentials()才能带 cookie —— 此时要立刻换掉"*",否则前端 fetch 会卡在 pending - 注意
handlers.CORS默认拦截OPTIONS并返回 204,不用额外写分支
Gin 项目别用 gin-contrib/cors 的默认配置
这个库的 cors.Default() 会设 AllowOrigins: []string{"*"},一旦你开了 AllowCredentials: true,整个响应就被浏览器静默丢弃。必须显式传 Config:
- 删掉
cors.Default(),改用cors.New(config) -
config.AllowOrigins写死为[]string{"http://localhost:3000", "http://127.0.0.1:3000"}(开发)或从环境变量读取(生产) -
config.AllowCredentials = true时,config.AllowOrigins里绝不能出现"*",哪怕只多一个也会失效 - 注册顺序必须是
r := gin.Default()后立即r.Use(corsMiddleware),不能放在路由注册之后
手写中间件时最容易踩的三个坑
自己写 func corsMiddleware(next http.Handler) http.Handler 看似灵活,但错一点就全链路失败:
-
r.Method == "OPTIONS"分支里必须调w.WriteHeader(http.StatusNoContent)或http.StatusOK,然后return—— 漏掉return会导致继续执行下游逻辑 -
w.Header().Set()必须在w.WriteHeader()或首次w.Write()之前,顺序反了头就丢了 - 如果前端带
credentials: 'include',你回的Access-Control-Allow-Origin必须是请求头里的Origin值(完整协议+域名+端口),不能硬编码,否则白名单校验失效
OPTIONS 被透传到下游、AllowCredentials 和 * 同时存在、或者头写晚了一步——这些错误不会报错,只让请求卡住,查起来特别费时间。










