Axios có quyền truy cập vào các trường tiêu đề phản hồi


159

Tôi đang xây dựng một ứng dụng lối vào với React và Redux và tôi đang sử dụng các axios để thực hiện các yêu cầu của mình. Tôi muốn có quyền truy cập vào tất cả các trường trong tiêu đề của phản hồi. Trong trình duyệt của tôi, tôi có thể kiểm tra tiêu đề và tôi có thể thấy rằng tất cả các trường mà tôi cần đều có mặt (như mã thông báo, uid, v.v.), nhưng khi tôi gọi

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

Tôi chỉ nhận được

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

Ở đây, tab mạng trình duyệt của tôi, như bạn có thể thấy tất cả các trường khác có mặt.

nhập mô tả hình ảnh ở đây

Tốt nhất


Nếu bạn in ra axios.defaults.headers, điều đó có cung cấp cho bạn bất kỳ ai trong số bạn đang thiếu không? Một số tiêu đề được định cấu hình ở cấp đó, không phải ở mỗi yêu cầu (xem github.com/mzabriskie/axios#global-axios-defaults )
Ben Hare

2
Không phải nó axios.defaults.headersđể cấu hình các thông số tiêu đề REQUEST sao? Tôi cần truy cập vào RESPONSE. @BenHare
TWONEKSONE

BTW, những gì bạn gọi là yêu cầu, không phải là một yêu cầu. Đó là một lời hứa cho phản ứng của bạn. Yêu cầu của bạn là những gì bạn đã chuyển cho phương thức post () làm đối số.
Daniel

Câu trả lời:


308

Trong trường hợp yêu cầu CORS, các trình duyệt chỉ có thể truy cập các tiêu đề phản hồi sau theo mặc định:

  • Kiểm soát bộ nhớ cache
  • Nội dung ngôn ngữ
  • Loại nội dung
  • Hết hạn
  • Sửa đổi lần cuối
  • Thực dụng

Nếu bạn muốn ứng dụng khách của mình có thể truy cập các tiêu đề khác, bạn cần đặt tiêu đề Access-Control-Expose-Headers trên máy chủ:

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

Xấu của tôi, tôi quên để lộ những lĩnh vực đó
TWONEKSONE

27
Nếu bạn đang sử dụng Rails với Rack-Cors, bạn cần đặt expose: ['Access-Token', 'Uid']nguồn gốc như:resource '*', :headers => :any, :methods => [:get, :post, :put, :patch, :delete, :options, :head], expose: ['Access-Token', 'Uid']
CWitty

3
Tôi không hiểu Nếu chúng không được hiển thị, tại sao các tiêu đề bổ sung có thể nhìn thấy trong trình duyệt nhưng không có trong phản hồi của axios?
adanilev

4
@adanilev, trình duyệt cho phép bạn xem chúng cho mục đích gỡ lỗi, nhưng ngăn bạn truy cập chúng thông qua API vì lý do bảo mật. Nó ngăn khách hàng nhận thông tin bảo mật từ máy chủ, cho phép máy chủ xác định quyền truy cập của khách hàng. TLDR: nó được thực hiện với mục đích bảo mật
xóa

2
Tôi có cái này trong tệp confg NGINX của tôi ... 'Access-Control-Expose-Headers' 'Authorization, X-Suggested-Filename, content-disposition' always; Vẫn chỉ thấy content-type: "application/pdf" thực sự cần phải kéocontent-disposition
Ông già Walter

17

Điều này thực sự giúp tôi, cảm ơn Nick Uraltsev vì câu trả lời của bạn.

Đối với những bạn sử dụng nodejs với cors :

...
const cors = require('cors');

const corsOptions = {
  exposedHeaders: 'Authorization',
};

app.use(cors(corsOptions));
...

Trong trường hợp bạn đang gửi phản hồi theo cách res.header('Authorization', `Bearer ${token}`).send();


1
Đối với những thắc mắc, bạn có thể vượt qua một mảng ở đây quá: exposedHeaders: [ 'Authorization', 'X-Tổng-Đếm']
Thiago Santana

10

Tôi đã phải đối mặt với cùng một vấn đề. Y đã làm điều này trong "WebSecurity.java" của tôi, đó là về phương thức setExposedHeaders trong cấu hình cors.

@Bean
CorsConfigurationSource corsConfigurationSource() {

    CorsConfiguration configuration = new CorsConfiguration();
    configuration.setAllowCredentials(true);
    configuration.setAllowedOrigins(Arrays.asList(FRONT_END_SERVER));
    configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE"));
    configuration.setAllowedHeaders(Arrays.asList("X-Requested-With","Origin","Content-Type","Accept","Authorization"));

    // This allow us to expose the headers
    configuration.setExposedHeaders(Arrays.asList("Access-Control-Allow-Headers", "Authorization, x-xsrf-token, Access-Control-Allow-Headers, Origin, Accept, X-Requested-With, " +
            "Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers"));

    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", configuration);
    return source;
}

Tôi hy vọng nó hoạt động.


7

Đối mặt với vấn đề tương tự trong lõi asp.net Hy vọng điều này sẽ giúp

public static class CorsConfig
{
    public static void AddCorsConfig(this IServiceCollection services)
    {
        services.AddCors(options =>
        {
            options.AddPolicy("CorsPolicy",
                builder => builder
                .WithExposedHeaders("X-Pagination")
                );
        });
    }
}

1
Chào mừng đến với SO! Câu trả lời của bạn có thể đúng nhưng tại StackOverflow, không nên chỉ trả lời mã. Hãy cố gắng cung cấp một lời giải thích về cách câu trả lời của bạn giải quyết câu hỏi ban đầu. xin vui lòng đọc phần này về cách viết câu trả lời tốt hơn
nircraft

Cảm ơn bạn, nó đã giúp;)
Florian

2

Theo tài liệu chính thức :

Điều này có thể hữu ích nếu bạn muốn các tiêu đề HTTP mà máy chủ phản hồi . Tất cả các tên tiêu đề được đặt thấp hơn và có thể được truy cập bằng cách sử dụng ký hiệu ngoặc. Ví dụ: response.headers['content-type']sẽ cung cấp một cái gì đó như: tiêu đề: {},


1

Đối với SpringBoot2 chỉ cần thêm

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

mã triển khai bộ lọc CORS của bạn để có danh sách trắng custom-header1custom-header2vv


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.