返回数据这块已经处理了。现在对跨域进行处理。
# 默认跨域
r.Response.CORSDefault()
允许所有跨域是不安全的。所以得对允许的域名进行跨域,或干脆不跨域。跨域中间件完善。
func (s *sMiddleware) CORS(r *ghttp.Request) {
corsOptions := r.Response.DefaultCORSOptions()
corsOptions.AllowDomain = []string{"localhost:5173"}
corsOptions.AllowOrigin = "http://localhost:5173"
corsOptions.AllowCredentials = "false"
corsOptions.AllowMethods = "POST,GET,OPTIONS,PUT,PATCH,DELETE"
corsOptions.AllowHeaders = "Accept,Content-Type,Referer,User-Agent,Origin,X-Requested-With,X-XSRF-TOKEN,X-CSRF-TOKEN,Authorization,Time"
r.Response.CORS(corsOptions)
r.Middleware.Next()
}
这样就够了,主要设置的是允许跨的域,允许跨的请求方式,允许 header 中携带的值以及是否使用 Credentials。主要就这几个的定义。
单独抽离 CORS
cors 可以使用配置来处理,放在代码里,太不好看了。
先建立配置文件 manifest/config/cors.yaml
cors:
admin:
allow_domain: ["localhost:5173"]
allow_origin: "http://localhost:5173"
allow_credentials: "false"
allow_methods: "POST,GET,OPTIONS,PUT,PATCH,DELETE"
allow_headers: "Accept,Content-Type,Referer,User-Agent,Origin,X-Requested-With,X-XSRF-TOKEN,X-CSRF-TOKEN,Authorization,Time"
再建 internal/logic/middleware/cors_middleware.go 文件
package middleware
import (
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
)
type CORSConfig struct {
AllowDomain []string `json:"allow_domain"`
AllowOrigin string `json:"allow_origin"`
AllowCredentials string `json:"allow_credentials"`
AllowMethods string `json:"allow_methods"`
AllowHeaders string `json:"allow_headers"`
}
func CORS(r *ghttp.Request) {
corsConfig := &CORSConfig{}
err := g.Cfg("cors").MustGet(r.GetCtx(), "cors.admin").Scan(corsConfig)
if err != nil {
gerror.Wrap(err, "cors config 配置错误")
return
}
corsOptions := r.Response.DefaultCORSOptions()
corsOptions.AllowDomain = corsConfig.AllowDomain
corsOptions.AllowOrigin = corsConfig.AllowOrigin
corsOptions.AllowCredentials = corsConfig.AllowCredentials
corsOptions.AllowMethods = corsConfig.AllowMethods
corsOptions.AllowHeaders = corsConfig.AllowHeaders
r.Response.CORS(corsOptions)
}
最后,修改 internal/logic/middleware/middleware.go 文件
func (s *sMiddleware) CORS(r *ghttp.Request) {
CORS(r)
r.Middleware.Next()
}
这样就好了。