ZBLOG

mux.CORSMethodMiddleware

mux.CORSMethodMiddleware 是 Gorilla/mux 提供的一个内置中间件,用于自动处理 CORS(跨域资源共享) 的 HTTP 方法协商。它会根据路由配置自动生成 Access-Control-Allow-Methods 响应头,避免手动维护允许的方法列表。


功能说明

  1. 核心作用
    在响应 OPTIONS 预检请求时,自动返回当前路由支持的 HTTP 方法(如 GET, POST 等),并设置以下头部:

    • Access-Control-Allow-Methods: 允许的 HTTP 方法列表
    • Access-Control-Allow-Origin: 需配合其他中间件设置(默认不处理)
  2. 典型场景
    当浏览器发起跨域请求时(如前端域名 example.com 访问后端 API api.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)) 

    // ...路由配置...
}

注意事项

  1. 必须显式声明 Methods
    只有通过 .Methods() 明确指定的路由才会被中间件识别。例如:

    r.HandleFunc("/path", handler).Methods("GET", "POST") //生效
    r.HandleFunc("/path", handler)                        //不生效
    
  2. 与前端配合
    确保前端请求携带正确的 OriginContent-Type(如为复杂请求)。

  3. 生产环境建议

    • 限制具体的域名而非通配符 (*)
    • 结合 HTTPS


      内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=24039

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?