Axios는 응답 헤더 필드에 액세스합니다


160

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"}

다른 모든 필드가 표시되는 것처럼 여기 내 브라우저 네트워크 탭.

여기에 이미지 설명을 입력하십시오

최고.


axios.defaults.headers를 인쇄하면 누락 된 것이 있습니까? 일부 헤더는 각 요청의 헤더가 아닌 해당 레벨에서 구성됩니다 ( github.com/mzabriskie/axios#global-axios-defaults 참조 )
Ben Hare

2
axios.defaults.headersREQUEST 헤더 매개 변수를 구성 하지 않습니까? RESPONSE에 액세스해야합니다. @BenHare
TWONEKSONE

요청이라고하는 BTW는 요청이 아닙니다. 귀하의 답변에 대한 약속입니다. 귀하의 요청은 post () 메소드에 인수로 전달 된 것입니다.
Daniel

답변:


311

CORS 요청의 경우 브라우저는 기본적으로 다음 응답 헤더에만 액세스 할 수 있습니다.

  • 캐시 제어
  • 내용 언어
  • 컨텐츠 타입
  • 만료
  • 마지막 수정
  • 프라 그마

클라이언트 앱이 다른 헤더에 액세스 할 수있게 하려면 서버 에서 Access-Control-Expose-Headers 헤더를 설정해야합니다.

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

내 나쁜 나는 그 필드를 노출하는 것을 잊었다.
TWONEKSONE 2016 년

27
Rack-Cors와 함께 Rails를 사용하는 경우 다음 expose: ['Access-Token', 'Uid']과 같이 원점 을 설정해야합니다 .resource '*', :headers => :any, :methods => [:get, :post, :put, :patch, :delete, :options, :head], expose: ['Access-Token', 'Uid']
CWitty

3
나는 그것을 얻지 못한다. 노출되지 않은 경우 왜 추가 헤더가 브라우저에서 보이지만 액시 오스 응답에서는 보이지 않습니까?
adanilev

4
@adanilev의 브라우저에서는 디버깅 목적으로 브라우저를 볼 수 있지만 보안상의 이유로 API를 통해 브라우저에 액세스하지 못하게합니다. 클라이언트가 서버에서 보안 자격 증명을 얻지 못하도록하여 서버가 클라이언트의 액세스 권한을 결정할 수 있도록합니다. TLDR : 그것은 보안을위한 목적에서 이루어집니다
erfling

2
나는 ... 내 Nginx에의 confg 파일이이 'Access-Control-Expose-Headers' 'Authorization, X-Suggested-Filename, content-disposition' always; 여전히 참조 content-type: "application/pdf" 정말 풀 필요content-disposition
노인 월터

17

귀하의 답변에 대한 Nick Uraltsev에게 감사드립니다.

당신이 사용하는 사람들을 위해 nodejs을 함께 고르 :

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

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

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

당신이 방법으로 응답을 보내는 경우 res.header('Authorization', `Bearer ${token}`).send();


1
궁금한 분들을 위해 여기에도 배열을 전달할 수 있습니다. exposedHeaders : [ 'Authorization', 'X-Total-Count']
Thiago Santana

11

나는 같은 문제에 직면했다. 나는 "WebSecurity.java"에서 이것을 수행했다. cors 구성의 setExposedHeaders 메소드에 관한 것이다.

@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;
}

나는 그것이 작동하기를 바랍니다.


7

asp.net 코어에서 동일한 문제에 직면했습니다.

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

1
SO에 오신 것을 환영합니다! 귀하의 답변은 정확하지만 StackOverflow에서는 코드 전용 답변을 게시하지 않는 것이 좋습니다. 답변이 원래 질문을 어떻게 해결하는지에 대한 설명을 제공하십시오. 더 나은 답변
nircraft

감사합니다. 도움이되었습니다.)
Florian

2

공식 문서 에 따르면 :

서버가 응답HTTP 헤더를 원하는 경우 도움이 될 수 있습니다 . 모든 헤더 이름은 소문자이며 대괄호 표기법을 사용하여 액세스 할 수 있습니다. 예 : response.headers['content-type']헤더 : {},


1

SpringBoot2의 경우 다음을 추가하십시오.

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

당신의 CORS 필터 구현 코드에 허용 된 것으로 custom-header1custom-header2



0

Spring Boot 2의 경우 전역 CORS 구성을 사용하지 않으려면 @CrossOriginatribute와 함께 어노테이션을 사용하여 메소드 또는 클래스 / 컨트롤러 레벨로 수행 할 수 있습니다 exposedHeaders.

예를 들어, 헤더 추가 authorization에 대한 YourController방법 :

@CrossOrigin(exposedHeaders = "authorization")
@RestController
public class YourController {
    ...
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.