【问题标题】:server running on localhost:8080 getting CORS from frontend running on 9090在 localhost:8080 上运行的服务器从 9090 上运行的前端获取 CORS
【发布时间】:2018-12-30 16:15:40
【问题描述】:

我有一个在 localhost:8080 上运行的 API 服务器 (gin-gonic)。 所有典型的 CORS-Header 都设置为用于调试: 当我尝试使用简单的前端 (swagger-ui) 测试 API 时,我得到一个 CORS 错误。 (招摇在 localhost:9090 上运行)

当一切都在同一个域上运行时,它可以工作。

c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
c.Writer.Header().Set("Access-Control-Allow-Headers", "*")
c.Writer.Header().Set("Access-Control-Allow-Methods", "POST, OPTIONS, GET, PUT")

为什么这不起作用。这 3 行是否应该避免所有 CORS 问题?

我对实际的解释而不是简单的解决方案非常好奇。欢迎所有与此相关的资源(或关于 CORS 的优秀资源)。

在 Postman 或 CURL 中运行良好

浏览器中的错误消息:

【问题讨论】:

  • 你能把你得到的错误信息包括进来吗?
  • “难道这 3 行代码不能避免所有 CORS 问题吗?” 不,当使用 Origin 时,您是否也在使用凭据?如果是这样"*" 将失败。在这种情况下,您应该传入原点,而不是 *Headers 不允许 "*"
  • 感谢您的快速反馈。附上屏幕截图或错误。
  • @mkopriva,我也用 c.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Content-Length, Accept-Encoding, X -CSRF-Token, Authorization, accept, origin, Cache-Control, X-Requested-With") 结果一样
  • 请求中似乎没有返回任何内容。实际上,它看起来像一个非 200 的 HTTP 状态码。您的请求返回的状态码是什么?

标签: go go-gin


【解决方案1】:

当您将 OPTION 作为 Preflight 请求捕获时 您的服务器应该返回成功。我在您提供的代码中找不到返回值。

你也可以尝试使用https://github.com/rs/cors

package main

import (
    "net/http"

    "github.com/gin-gonic/gin"
    cors "github.com/rs/cors/wrapper/gin"
)

func main() {
    router := gin.Default()

    router.Use(cors.Default())
    router.GET("/", func(context *gin.Context) {
        context.JSON(http.StatusOK, gin.H{"hello": "world"})
    })

    router.Run(":8080")
}

【讨论】:

  • 我用 cors "github.com/rs/cors/wrapper/gin" 试过了。工作正常。我不明白为什么。
猜你喜欢
  • 2021-05-04
  • 2021-05-03
  • 2018-02-18
  • 2019-05-29
  • 2018-09-04
  • 1970-01-01
  • 2017-03-21
  • 1970-01-01
  • 2012-10-08
相关资源
最近更新 更多