跨源资源共享(CORS)是一种机制,它使用额外的 HTTP 头来告诉浏览器,允许在一个域名的网页应用中去访问另一个域名下的资源。在 Go 语言的 chi 服务器中实现 CORS,可以通过中间件(Middleware)来完成。
CORS 的核心在于预检请求(Preflight Request),这是一个由浏览器自动发起的 OPTIONS 请求,用于确定实际请求是否安全。服务器需要在响应中包含特定的 CORS 头,如 Access-Control-Allow-Origin
、Access-Control-Allow-Methods
和 Access-Control-Allow-Headers
等。
以下是如何在 Go 语言的 chi 服务器中实现 CORS 的示例代码:
package main
import (
"net/http"
"github.com/go-chi/chi/v5"
"github.com/go-chi/cors"
)
func main() {
r := chi.NewRouter()
// CORS 中间件配置
corsWrapper := cors.New(cors.Options{
AllowedOrigins: []string{"https://example.com"}, // 允许的源
AllowedMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}, // 允许的方法
AllowedHeaders: []string{"Accept", "Authorization", "Content-Type", "X-CSRF-Token"}, // 允许的头部
ExposedHeaders: []string{"Link"}, // 允许浏览器访问的响应头部
AllowCredentials: true, // 凭证共享
MaxAge: 300, // 预检请求缓存时间(秒)
})
r.Use(corsWrapper.Handler)
r.Get("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello World!"))
})
http.ListenAndServe(":3000", r)
}
原因:服务器没有正确设置 CORS 头,或者预检请求的响应状态码不是 2xx。
解决方法:确保 CORS 中间件正确配置,并且服务器能够正确响应 OPTIONS 请求。
原因:Access-Control-Allow-Origin
头没有包含请求的源,或者 Access-Control-Allow-Credentials
设置为 true
时,Access-Control-Allow-Origin
不能设置为 *
。
解决方法:检查并调整 AllowedOrigins
配置,或者在使用凭证时指定具体的源。
原因:请求的方法没有在 AllowedMethods
中列出。
解决方法:添加所需的方法到 AllowedMethods
列表中。
通过上述步骤和示例代码,你可以使 CORS 与 Go 语言的 chi 服务器协同工作,从而支持跨域请求。
领取专属 10元无门槛券
手把手带您无忧上云