我正在使用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"}
这是我的浏览器网络标签,因为您可以看到所有其他字段都存在。
贝斯茨。
答案 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)
如果您想要服务器响应的 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-header1
和custom-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-headers
(https://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']