如何解决如何在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,并且效果很好。
func CORS(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter,r *http.Request) {
w.Header().Add("Access-Control-Allow-Origin","*")
w.Header().Add("Access-Control-Allow-Credentials","true")
w.Header().Add("Access-Control-Allow-Headers","Content-Type,Content-Length,Accept-Encoding,X-CSRF-Token,Authorization,accept,origin,Cache-Control,X-Requested-With")
w.Header().Add("Access-Control-Allow-Methods","POST,GET,OPTIONS,PUT,DELETE")
if r.Method == "OPTIONS" {
http.Error(w,"No Content",http.StatusNoContent)
return
}
next(w,r)
}
}
在此代码块中,您可以看到标题设置其他来源的权限,这可以使您的资源可从其他域访问。
一种使用此方法的方法(如果您使用的是标准HTTP库),就像中间件一样:
func mainHandler(w http.ResponseWriter,r *http.Request){ ... }
http.HandleFunc("/",CORS(mainHandler),)
,
CORS是一种机制,用于防止在浏览器中运行的脚本(即Javascript)来自不同的源(服务器)调用特定服务器。该特定服务器需要小心任何脚本自身,因为可能会应用某些恶意程序或任何授权策略。该特定服务器可以在其API中创建一个中间件来检查预检请求,该预检请求是使用OPTIONS方法以及它带有某些特定标头的CORS请求。
Preflight请求是CORS模型的组成部分,它是应用于浏览器的CORS机制标准化的一部分。因此,发送此预检请求的人是浏览器,如果有任何通过浏览器执行的脚本(不要误以为是从浏览器地址栏点击)。此预检请求适用于通常执行请求的API,例如在Javascript中,您具有XMLHttpRequest或Fetch API。通过这些API发送的具有任何方法的任何类型的请求之前,都将使用OPTIONS方法调用称为“预检”请求的单独请求,该请求带有附加的标头,详细说明了调用者的信息。目标服务器将通过检查其请求标头并将其与应用的CORS规则进行比较来处理此预检请求。此选项将返回有关其方法,起源(允许的起源)或根据其规则允许的任何标头的信息。此预检请求完成后,将获得包含目标服务器详细信息策略信息的标头详细信息的响应。如果调用者没有违反基于该服务器cors策略的任何内容,则API /浏览器将在该预检请求(即实际请求)之后发出下一个请求。否则将返回cors错误,并且永远不会提出实际要求。
从浏览器地址栏调用不会产生任何效果,因为您没有执行任何脚本(从浏览器),并且浏览器地址栏通常是GET方法,而不是OPTIONS方法,因此不会被视为预检请求。如果您从使用其他编程语言(例如Go)制作的客户端进行调用,则此处未应用CORS机制,因为像其他所说的cors一样,它也适用于浏览器中脚本的调用。如果您要过滤来自其他服务器的浏览器(例如Go)以外的客户端请求,那么您需要的是OAUTH机制或ACL(访问控制列表),它们不同,并且与CORS无关。
与您所引用的程序包有关,该程序包是为了简化您的工作,因此您不必自己处理其他标头和预检请求,而是可以将处理程序包装在程序包中。
有关CORS here
的更多信息版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。