无法访问前端应用程序中的自定义响应标头

时间:2019-10-07 03:58:10

标签: http go http-headers axios

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

chrome开发人员工具响应标头。我希望在底部获得x-***令牌 chrome dev tools . response headers

我可以通过axios访问的

标头(启用了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访问的

标头(禁用了cors) enter image description here

这告诉我,这与axios无关,但与我的标头配置有关。

以下是我们配置标头的方式,我试图访问 x-custom-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)
})}

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

1 个答案:

答案 0 :(得分:1)

您的问题是,您只公开提出OPTIONS请求。

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

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

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

解决方案-调整逻辑以将曝光头与飞行前头分开处理。