Write the Code. Change the World.

9月 11

返回数据这块已经处理了。现在对跨域进行处理。

# 默认跨域
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()
}

这样就好了。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注