在 GoLang 中启用 CORS
本篇文章介绍如何在 GoLang 中启用和使用 CORS。
Go 语言 CORS
跨源资源共享 (CORS) 是一个基于 HTTP 标头的过程,它定义了允许浏览器加载和使用资源的来源。 CORS用于放宽同源策略策略,允许一个页面的JS脚本访问其他页面的数据。
同源策略确保两个网页同源。 此策略通过隔离恶意文档来帮助提高安全性。
CORS 用于通过使用表中所示的标头来放宽同源策略:
标头 | 类型 | 说明 |
---|---|---|
Origin | Request | 用于向服务器指示请求的来源。 |
Access-Control-Request-Method | Request | 用于表示实现对服务器请求的HTTP方法。 |
Access-Control-Request-Headers | Request | 用于指示对服务器的请求中的标头。 |
Access-Control-Allow-Origin | Response | 用于服务器允许的来源。 |
Access-Control-Allow-Methods | Response | 用于服务器允许的以逗号分隔的方法列表。 |
Access-Control-Allow-Headers | Response | 用于服务器允许的以逗号分隔的标头列表。 |
Access-Control-Expose-Headers | Response | 用于允许客户端访问响应的逗号分隔标头列表。 |
Access-Control-Max-Age | Response | 用于通知服务器需要多少秒来缓存对飞行前请求的响应。 |
Access-Control-Allow-Credentials | Response | 用于允许或限制服务器的凭据。 |
在 GoLang 中启用 CORS
我们可以在 Go 中实现一个函数,通过使用 Go 语言的 net/http 包来实现我们的 CORS 策略。 按照分步过程在 GO 中启用 CORS
创建一个在本地主机上运行的应用程序,其端口号包含将从其他页面访问当前服务器资源的标头。 查看标题:
Response_Writer.Header().Set("Content-Type", "text/plain; charset=utf-8")
Response_Writer.Header().Set("Access-Control-Allow-Origin", "http://127.0.1.1:5555")
Response_Writer.Header().Set("Access-Control-Max-Age", "10")
- 如我们所见,我们启用了 CORS 策略,因此来自 http://127.0.1.1:5555 的 JS 脚本可以访问我们页面或资源中的数据。 最好将这些标头保存在一个方法中,以便我们可以为我们的服务器实施 CORS 策略。
-
现在为我们的服务器设置 CORS 策略; 例如,headers 的函数是 JiyikHandler。 现在这样做:
http.HandleFunc("/Jiyik", JiyikHandler) log.Fatal(http.ListenAndServe(":3000", nil))
log.Fatal(http.ListenAndServe(":3000", nil))
将为我们的服务器设置 CORS 策略。 让我们实现这个示例并查看输出。
CORS 策略的 GoLang 文件:
package main
import (
"fmt"
"log"
"net/http"
)
func main() {
http.HandleFunc("/Jiyik", JiyikHandler)
log.Println("Listening the request..")
log.Fatal(http.ListenAndServe(":3000", nil))
}
func JiyikHandler(Response_Writer http.ResponseWriter, _ *http.Request) {
Response_Writer.Header().Set("Content-Type", "text/plain; charset=utf-8")
Response_Writer.Header().Set("Access-Control-Allow-Origin", "http://127.0.1.1:5555")
Response_Writer.Header().Set("Access-Control-Max-Age", "10")
fmt.Fprintf(Response_Writer, "Hello, this is Jiyik.com!")
}
用于响应的 HTML/JS 文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Jiyik</title>
</head>
<body>
<script>
async function doRequest() {
let localhost_url = 'http://localhost:3000/Jiyik';
let page_response = await fetch(localhost_url);
if (page_response.ok) {
let text = await page_response.text();
return text;
} else {
return `HTTP error: ${page_response.status}`;
}
}
doRequest().then(data => {
document.getElementById("print_output").innerText = data;
});
</script>
<div id="print_output">
</div>
</body>
</html>
上面的代码会写响应你好,这里是极易网! 来自 HTML/JS 页面中的 Go 代码。
查看输出:
Go 语言中的 CORS 包
第三方包 CORS 用于通过定义 NET/HTTP 处理程序来实现跨源资源共享。 在开始使用这个包之前,我们必须安装它。
使用以下命令:
go get github.com/rs/cors
安装成功后,我们就可以在代码中使用 CORS 了。 让我们尝试一个简单的例子:
package main
import (
"net/http"
"github.com/rs/cors"
)
func main() {
Demo_Mux := http.NewServeMux()
Demo_Mux.HandleFunc("/", func(Response_Writer http.ResponseWriter, Req *http.Request) {
Response_Writer.Header().Set("Content-Type", "application/json")
Response_Writer.Write([]byte("{\"hello!\": \"This is Jiyik.com\"}"))
})
DemoHandler := cors.Default().Handler(Demo_Mux)
http.ListenAndServe(":3000", DemoHandler)
}
在上面的代码中,cors.Default()
将设置一个具有默认选项的中间件,其中所有来源都通过 GET 和 POST 等简单方法接受。
查看上面代码的输出:
在 Go 中将 GET 和 POST 方法与 CORS 结合使用
我们还可以使用 GET 和 POST 方法通过 CORS 发送请求。 我们必须使用 AllowedMethods 字段在 CORS 中分配它们。
让我们看例子:
package main
import (
"net/http"
"github.com/rs/cors"
)
func main() {
Demo_Mux := http.NewServeMux()
Demo_CORS := cors.New(cors.Options{
AllowedOrigins: []string{"*"}, //all
AllowedMethods: []string{http.MethodPost, http.MethodGet},
AllowedHeaders: []string{"*"}, //all
AllowCredentials: false, //none
})
Demo_Mux.HandleFunc("/Jiyik", func(Response_Writer http.ResponseWriter, r *http.Request) {
Response_Writer.Header().Set("Content-Type", "application/json")
Response_Writer.Write([]byte("{\"hello!\": \"This is Jiyik.com\"}"))
})
Demo_Handler := Demo_CORS.Handler(Demo_Mux)
http.ListenAndServe(":3000", Demo_Handler)
}
上面的代码将使用 CORS 包来实现策略并启用 GET 和 POST 两种方法来发送请求。
查看输出:
相关文章
在 Golang 中使用 If-Else 和 Switch Loop Inside HTML 模板
发布时间:2023/04/27 浏览次数:65 分类:Go
-
本篇文章介绍了在 Golang 的 HTML 模板中使用 if-else 和 switch 循环。因此,只要输出是 HTML,就应该始终使用 HTML 模板包而不是文本模板。
Golang 中的零值 Nil
发布时间:2023/04/27 浏览次数:166 分类:Go
-
本篇文章介绍 nil 在 Golang 中的含义,nil 是 Go 编程语言中的零值,是众所周知且重要的预定义标识符。
Golang 中的 Lambda 表达式
发布时间:2023/04/27 浏览次数:93 分类:Go
-
本篇文章介绍如何在 Golang 中创建 lambda 表达式。Lambda 表达式似乎不存在于 Golang 中。 函数文字、lambda 函数或闭包是匿名函数的另一个名称。
在 Go 中捕获 Panics
发布时间:2023/04/27 浏览次数:66 分类:Go
-
像错误一样,Panic 发生在运行时。 换句话说,当您的 Go 程序中出现意外情况导致执行终止时,就会发生 Panics。让我们看一些例子来捕捉 Golang 中的Panics。
在 Go 中使用断言
发布时间:2023/04/27 浏览次数:181 分类:Go
-
本篇文章介绍了 assert 在 GoLang 中的使用。在 Go 语言中使用断言:GoLang 不提供对断言的任何内置支持,但我们可以使用来自 Testify API 的广泛使用的第三方包断言。
Go 中的随机数生成
发布时间:2023/04/27 浏览次数:114 分类:Go
-
本篇文章介绍如何在 Go 语言中使用随机数生成功能。Go 中的随机数生成 Go 语言为随机数生成功能提供内置支持。 内置包 math 有方法 rand(),用于随机数生成。