go - 如何在 Go 中启用 CORS
问题描述
我是 golang 中这个 CORS 的新手。我使用这个包“github.com/rs/cors”。我用示例代码对其进行了测试:
package main
import (
"log"
"net/http"
"github.com/julienschmidt/httprouter"
"github.com/rs/cors"
)
func Hello(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
w.Header().Set("Content-Type", "application/json")
w.Write([]byte("{\"hello\": \"world\"}"))
}
func main() {
router := httprouter.New()
router.GET("/", Hello)
_cors := cors.Options{
AllowedMethods: []string{"POST", "OPTIONS"},
AllowedOrigins: []string{"http://localhost:8080"},
}
handler := cors.New(_cors).Handler(router)
http.ListenAndServe(":8282", handler)
}
当我从浏览器点击时,它正常响应,没有任何问题。当我从 Go 中制造的客户端中击中时,同样的事情发生了。我想念什么?
编辑:我希望这个 CORS 将过滤来自不同来源/服务器的请求。当我只将允许的方法设置为 POST 和 OPTIONS 时,我从浏览器和 Go 中制作的客户端使用 GET 时,由于不允许 GET,它是否应该返回错误?,如何使用这个包?
解决方案
CORS 是一种防止在浏览器中运行的脚本(即 Javascript)来自不同来源(服务器)调用特定服务器的机制。这个特定的服务器需要小心任何脚本攻击自己,因为可能会应用一些恶意的东西或任何授权策略。这个特定的服务器可以在其 API 中创建一个中间件来检查预检请求,这是一个使用 OPTIONS 方法的 CORS 请求,它带有一些特定的标头。
预检请求是 CORS 模型的一个组件,其中这是应用于浏览器的 CORS 机制标准化的一部分。因此,如果有任何脚本通过浏览器执行,则发送此预检请求的人是浏览器(不要误认为是从浏览器地址栏点击)。此预检请求应用于通常执行请求的 API,例如在 Javascript 中您有 XMLHttpRequest 或 Fetch API。通过这些 API 发送的具有任何方法的任何类型的请求都将在称为“预检”请求的单独请求之前使用 OPTIONS 方法带来额外的标头,详细说明调用者的信息。此预检请求将由目标服务器通过检查其请求标头并与其应用的 CORS 规则进行比较来处理。此选项将返回什么方法的信息,来源(允许的来源),或根据其规则允许的任何标头。一旦此预检请求完成并获得包含目标服务器 cors 策略信息的详细标头的响应。如果调用者没有违反基于该服务器 cors 策略的任何内容,则 API/浏览器将在作为实际请求的预检请求之后发出下一个请求。否则将作为 cors 错误返回,并且永远不会发出实际请求。
从浏览器地址栏调用不会有任何效果,因为您没有执行任何脚本(从浏览器),并且浏览器地址栏通常是 GET 方法,而不是 OPTIONS 方法,因此不会被视为预检请求。如果您从用其他编程语言(例如 Go)制作的客户端调用它,那么这里不应用 CORS 机制,因为就像其他所说的 cors 应用于从浏览器中的脚本调用一样。如果您想过滤来自不同服务器的浏览器(例如 Go)以外的客户端的请求,那么您需要的是 OAUTH 机制或 ACL(访问控制列表),它们是不同的,与这些 CORS 的东西无关。
关于您提到的包,该包是为了简化您的工作,因此您不必自己处理额外的标头和预检请求,而是可以将处理程序包装在包中。
更多关于 CORS的信息在这里
推荐阅读
- python - 如何计算每个开始和结束的差异 - Pandas Python
- android - Snackbar getAnchorView() 与父视图
- java - SAP Crystal Decisions 集成在 Linux 上不起作用
- eloquent - 选择查询生成器返回 null
- filtering - 索引 398120 超出轴 0 的范围,大小为 398120
- php - 更新购物车数量 PHP
- mongodb - 为什么当我安装后启动 mongod 时,它卡在 [ftdc] 将集合 local.oplog.rs 标记为集合版本:
- unity3d - 如何在 Unity 中向 HoloLens 2 应用程序添加语音命令?
- flutter - 颤动 URL_LAUNCHER 并返回
- c# - 将现有代码转换为 Span
,使用哪种方法?