mux.CORSMethodMiddleware
是 Gorilla/mux 提供的一个内置中间件,用于自动处理 CORS(跨域资源共享) 的 HTTP 方法协商。它会根据路由配置自动生成 Access-Control-Allow-Methods
响应头,避免手动维护允许的方法列表。
功能说明
核心作用
在响应OPTIONS
预检请求时,自动返回当前路由支持的 HTTP 方法(如GET
,POST
等),并设置以下头部:Access-Control-Allow-Methods
: 允许的 HTTP 方法列表Access-Control-Allow-Origin
: 需配合其他中间件设置(默认不处理)
典型场景
当浏览器发起跨域请求时(如前端域名example.com
访问后端 APIapi.example.com
),会先发送OPTIONS
请求进行预检,此时该中间件会自动返回允许的方法。
使用示例
1. 基础用法
package main
import (
"net/http"
"github.com/gorilla/mux"
)
func main() {
r := mux.NewRouter()
// 启用CORS方法中间件
r.Use(mux.CORSMethodMiddleware(r))
// 定义路由(注意:必须显式指定Methods)
r.HandleFunc("/books", GetBooks).Methods("GET")
r.HandleFunc("/books", CreateBook).Methods("POST")
http.ListenAndServe(":8080", r)
}
测试预检请求
curl -X OPTIONS http://localhost:8080/books \
-H "Origin: http://example.com" \
-H "Access-Control-Request-Method: POST"
响应头将包含:
Access-Control-Allow-Methods: GET, POST
2. 完整 CORS 配置(结合自定义中间件)
若需要更完整的 CORS 支持(如允许的域名、头部等),需额外编写中间件:
func enableCORS(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Access-Control-Allow-Origin", "*") //或指定域名如 "https://example.com"
w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization")
// OPTIONS预检请求直接返回200
if r.Method == "OPTIONS" {
w.WriteHeader(http.StatusOK)
return
}
next.ServeHTTP(w, r)
})
}
func main() {
r := mux.NewRouter()
//顺序重要!先处理CORS头,再处理方法协商
r.Use(enableCORS)
r.Use(mux.CORSMethodMiddleware(r))
// ...路由配置...
}
注意事项
必须显式声明 Methods
只有通过.Methods()
明确指定的路由才会被中间件识别。例如:r.HandleFunc("/path", handler).Methods("GET", "POST") //生效 r.HandleFunc("/path", handler) //不生效
与前端配合
确保前端请求携带正确的Origin
和Content-Type
(如为复杂请求)。生产环境建议
- 限制具体的域名而非通配符 (
*
)
- 结合 HTTPS
内容由零声教学AI助手提供,问题来源于学员提问
- 限制具体的域名而非通配符 (