http - 无法访问前端应用程序中的自定义响应 header

标签 http go http-headers axios

我无法访问后端服务器提供的自定义响应 header 。服务器是用 Go 编写的。我正在尝试使用 axios 作为我的 HTTP 客户端来访问它。我可以在 chrome dev-tools 控制台中看到标题,但我无法通过 axios 访问标题。

chrome 开发工具响应 header 。我正在寻找底部的 x-***-token
chrome dev tools . response headers

我可以通过 axios 访问的 header (启用了 cors)
headers I have access to through axios

但是,当我在禁用 cors 的情况下运行 chrome 时,我可以通过 axios 访问标题:
open -n -a /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --args --user-data-dir="/tmp/chrome_dev_test" --disable-web-security
我可以通过 axios 访问的 header (cors 已禁用)
enter image description here

这告诉我这不是 axios 的问题,而是我拥有的 header 配置。

下面是我们如何配置我们的 header ,我正在尝试访问 x-自定义 token 标题:

func allowCORS(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    if origin := r.Header.Get("Origin"); origin != "" && contains(cors, origin) {
        w.Header().Set("Access-Control-Allow-Origin", origin)
    }
    if contains(cors, "*") {
        w.Header().Set("Access-Control-Allow-Origin", "*")
    }

    if r.Method == "OPTIONS" || r.Method == "GET" && r.Header.Get("Access-Control-Request-Method") != "" &&
        w.Header().Get("Access-Control-Allow-Origin") != "" {
        headers := []string{"Content-Type", "Accept-Encoding", "X-CSRF-Token", "Authorization", "accept", "origin", "Cache-Control", "X-Requested-With", "x-custom-token"}
        w.Header().Set("Access-Control-Allow-Headers", strings.Join(headers, ","))
        methods := []string{"GET", "HEAD", "POST", "PUT", "DELETE"}
        w.Header().Set("Access-Control-Allow-Methods", strings.Join(methods, ","))
        expose := []string{"x-custom-token"}
        w.Header().Set("Access-Control-Expose-Headers", strings.Join(expose, ","))
        return
    }
    h.ServeHTTP(w, r)
})}

谁能告诉我我设置错误的标题?

最佳答案

您的问题是您仅针对 OPTIONS 请求公开。

在您的 if 语句中,您的条件之一是 r.Header.Get("Access-Control-Request-Method") != "" .

此 header 通常仅在飞行前请求中使用,因此您的公开 header 不会被写入 GET 或其他方法。

此外,您的语句在编写标题后返回。这对于飞行前是正确的,但会导致不会为其他方法发送任何内容。

解决方案 - 调整您的逻辑以处理与飞行前 header 分开的公开 header 。

关于http - 无法访问前端应用程序中的自定义响应 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58263373/

相关文章:

c# - 使用 jQuery.ajax() 时,HttpListener 仅获取 InputStream 的前 900 个字节

go - 当一个是 native 类型时,为什么 golang 禁止分配给相同的底层类型?

go - 警告 : Missing 'go_package' option

javascript - 在 form.submit 方法上添加标题问题

ajax - 如何在使用代理在 ext js 存储中发布请求时发送 JSON

c++ - HTTP post 和 wininet

http - 相对路径,但对于端口?

go - 分块任何 slice 的辅助函数?

http - Chrome MULTIPLE_CONTENT_LENGTH 错误

http-headers - 多行 HTTP header 混淆