迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Go >

在 GoLang 中启用 CORS

作者:迹忆客 最近更新:2023/04/26 浏览次数:

本篇文章介绍如何在 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 代码。

查看输出:

CORS Policy


Go 语言中的 CORS 包

第三方包 CORS 用于通过定义 NET/HTTP 处理程序来实现跨源资源共享。 在开始使用这个包之前,我们必须安装它。

使用以下命令:

go get github.com/rs/cors

Get 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 等简单方法接受。

查看上面代码的输出:

Simple CORS Output


在 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 两种方法来发送请求。

查看输出:

CORS GET POST

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Golang 中的零值 Nil

发布时间:2023/04/27 浏览次数:166 分类:Go

本篇文章介绍 nil 在 Golang 中的含义,nil 是 Go 编程语言中的零值,是众所周知且重要的预定义标识符。

Golang 中的 Lambda 表达式

发布时间:2023/04/27 浏览次数:93 分类:Go

本篇文章介绍如何在 Golang 中创建 lambda 表达式。Lambda 表达式似乎不存在于 Golang 中。 函数文字、lambda 函数或闭包是匿名函数的另一个名称。

Go 中的深度复制

发布时间:2023/04/27 浏览次数:90 分类:Go

当我们尝试生成对象的副本时,深层副本会准确复制原始对象的所有字段。 此外,如果它有任何对象作为字段,也会制作这些对象的副本。本篇文章介绍如何在 Golang 中进行深度复制。

在 Go 中捕获 Panics

发布时间:2023/04/27 浏览次数:66 分类:Go

像错误一样,Panic 发生在运行时。 换句话说,当您的 Go 程序中出现意外情况导致执行终止时,就会发生 Panics。让我们看一些例子来捕捉 Golang 中的Panics。

Go 中的日志级别

发布时间:2023/04/27 浏览次数:199 分类:Go

本篇文章介绍如何在 Golang 中创建和使用日志级别。Go 中的日志级别。Golang提供了一个日志包,名为log,是一个简单的日志包。 这个包不提供分级日志; 如果我们想要分级日志记录,我们必须

在 Go 中使用断言

发布时间:2023/04/27 浏览次数:181 分类:Go

本篇文章介绍了 assert 在 GoLang 中的使用。在 Go 语言中使用断言:GoLang 不提供对断言的任何内置支持,但我们可以使用来自 Testify API 的广泛使用的第三方包断言。

Go 中的随机数生成

发布时间:2023/04/27 浏览次数:114 分类:Go

本篇文章介绍如何在 Go 语言中使用随机数生成功能。Go 中的随机数生成 Go 语言为随机数生成功能提供内置支持。 内置包 math 有方法 rand(),用于随机数生成。

GoLang 电子邮件验证器

发布时间:2023/04/27 浏览次数:195 分类:Go

本篇文章介绍如何在 Go 语言中验证电子邮件。电子邮件需要特定格式; 否则,它们将无法工作。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便