Axios可以访问响应头字段

时间:2016-06-18 13:29:58

标签: http-headers es6-promise axios

我正在使用React和Redux构建一个前端应用程序,我正在使用axios来执行我的请求。我想访问响应标题中的所有字段。在我的浏览器中,我可以检查标题,我可以看到我需要的所有字段都存在(例如令牌,uid等等),但是当我打电话时

const request = axios.post(`${ROOT_URL}/auth/sign_in`, props);
request.then((response)=>{
  console.log(response.headers);
});

我得到了

Object {content-type: "application/json; charset=utf-8", cache-control: "max-age=0, private, must-revalidate"}

这是我的浏览器网络标签,因为您可以看到所有其他字段都存在。

enter image description here

贝斯茨。

13 个答案:

答案 0 :(得分:175)

如果是CORS请求,浏览器默认只能访问以下响应头:

  • 缓存控制
  • 内容的语言
  • 内容类型
  • 到期
  • 上次修改
  • 附注

如果您希望客户端应用能够访问其他标头,则需要在服务器上设置Access-Control-Expose-Headers标头:

Access-Control-Expose-Headers: Access-Token, Uid

答案 1 :(得分:5)

这确实对我有所帮助,谢谢尼克·乌拉尔采夫(Nick Uraltsev)的回答。

对于使用 nodejs cors的用户:

 2018-07-01 21:59:10.529  INFO [MyService,1234567890abcdef,fae6f4dac5903bb0,false] 19276 --- [           main] ...

如果您以private static Optional<Span> extractFromHeaders(Message<String> msg) { Optional<Map.Entry<String, Object>> traceIdValue = msg.getHeaders().entrySet().stream() .filter(header -> header.getKey().equals(TraceMessageHeaders.TRACE_ID_NAME) || header.getKey().equals("X-B3-TraceId") || header.getKey().equals("jms_correlationId")) .findFirst(); String traceId = traceIdValue.map(headerEntry -> headerEntry.getValue().toString()); long id = new BigInteger(traceId, 16).longValue(); return Span.builder().traceId(id).build(); } 的方式发送响应

答案 2 :(得分:4)

根据official docs

如果您想要服务器响应的 HTTP标头 ,这可能会有所帮助。所有标题名称均小写,可以使用方括号表示法进行访问。示例:response.headers['content-type']将给出类似以下内容:标头:{},

答案 3 :(得分:2)

我面临着同样的问题。是在我的“ WebSecurity.java”中完成的,这与cors配置中的setExposedHeaders方法有关。

protected void GridView1_DataBound1(object sender, EventArgs e)
{
   for (int rowIndex = GridView1.Rows.Count - 2; rowIndex >= 0; rowIndex--)
   {
       GridViewRow gvRow = GridView1.Rows[rowIndex];
       GridViewRow gvPreviousRow = GridView1.Rows[rowIndex + 1];

       for (int cellCount = 0; cellCount < gvRow.Cells.Count; cellCount++)
       {
          if (gvRow.Cells[cellCount].Text == gvPreviousRow.Cells[cellCount].Text)
          {
              if (gvPreviousRow.Cells[cellCount].RowSpan < 2)
              {
                  gvRow.Cells[cellCount].RowSpan = 2;
              }
              else
              {
                  gvRow.Cells[cellCount].RowSpan = gvPreviousRow.Cells[cellCount].RowSpan + 1;
              }

              gvPreviousRow.Cells[cellCount].Visible = false;
          }
       }
  }

我希望它能起作用。

答案 4 :(得分:1)

asp.net核心遇到相同的问题 希望这会有所帮助

query.ExecuteNextAsync<T>(cancellationToken);

答案 5 :(得分:1)

获得Django帮助

CORS_EXPOSE_HEADERS = [
        'your header'
    ]

答案 6 :(得分:1)

对于SpringBoot2,只需添加

httpResponse.setHeader("Access-Control-Expose-Headers", "custom-header1, custom-header2");

在您的CORS过滤器实现代码中将custom-header1custom-header2等列入白名单

答案 7 :(得分:1)

还有一个提示不在这次谈话中。 对于 ASP.NET 核心 3.1 首先添加您需要将其放在标题中的密钥,如下所示:

Response.Headers.Add("your-key-to-use-it-axios", "your-value");

在您定义 cors 策略的地方(通常在 Startup.cs 中),您应该像这样将此键添加到 WithExposedHeaders。

          services.AddCors(options =>
        {
        options.AddPolicy("CorsPolicy",
            builder => builder
                .AllowAnyHeader()
                .AllowAnyMethod()
                .AllowAnyOrigin()
                .WithExposedHeaders("your-key-to-use-it-axios"));
        });
    }

您可以在此处添加所有密钥。 现在,在您的客户端,您可以使用响应结果轻松访问 your-key-to-use-it-axios。

          localStorage.setItem("your-key", response.headers["your-key-to-use-it-axios"]);

你可以在所有客户端使用它之后像这样访问它:

const jwt = localStorage.getItem("your-key")

答案 8 :(得分:0)

我面临同样的问题。我设置了Access-Control-Expose-Headers: Set-Cookie,但仍然无法从标题中读取值

答案 9 :(得分:0)

对于Spring Boot 2,如果您不想使用全局CORS配置,则可以使用带有@CrossOrigin属性的exposedHeaders注释按方法或类/控制器级别进行操作。

例如,为authorization方法添加标题YourController

@CrossOrigin(exposedHeaders = "authorization")
@RestController
public class YourController {
    ...
}

答案 10 :(得分:0)

由于CORS限制,无法在客户端上访问自定义HTTP标头。您需要在服务器端添加Access-Control-Expose-Headers设置。

什么是Access-Control-Expose-Header?
请转到https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Expose-Headers

默认情况下,仅公开以下HTTP标头:

  • 缓存控制
  • 内容语言
  • 内容长度
  • 内容类型
  • 到期
  • 最后修改
  • 编译指示

对于自定义HTTP标头,您需要在响应标头中自定义Access-Control-Expose-Headers。

如果您在服务器端使用Django,则可以使用django-cors-headershttps://pypi.org/project/django-cors-headers/)进行CORS设置管理。

例如,使用django-cors-headers,您可以通过CORS_ALLOW_HEADERS设置添加要显示给浏览器的HTTP标头列表

from corsheaders.defaults import default_headers

CORS_ALLOW_HEADERS = list(default_headers) + [
    'my-custom-header',
]

答案 11 :(得分:0)

如果您在配置正确的CORS的后端使用Laravel 8,请将此行添加到schema

config/cors.php

答案 12 :(得分:0)

[扩展@vladimir 所说的内容]

如果您使用的是 Django
django-cors-headers 允许/控制 CORS, 您应该在 settings.py

中设置以下内容
CORS_EXPOSE_HEADERS = ['yourCustomHeader']