programing

Springfox Swagger에서 제공하는 Swagger /v2/api-docs에서 CORS 헤더를 활성화하려면 어떻게 해야 합니까?

lovecodes 2023. 8. 13. 10:11
반응형

Springfox Swagger에서 제공하는 Swagger /v2/api-docs에서 CORS 헤더를 활성화하려면 어떻게 해야 합니까?

프로젝트에 다음 파일이 있습니다.

@Configuration
@Order(Ordered.LOWEST_PRECEDENCE)
public class SwaggerConfig {

    @Bean
    public Docket apiSwagger2Documentation() { .... }
}

Application.java에는 다음이 있습니다.

@SpringBootApplication
@ComponentScan(basePackages = { ... })
@EnableSwagger2
public class Application {
    ...
}

Swagger JSON은 다음과 같이 제공됩니다./v2/api-docs그것은 잘 작동합니다.

제가 하고 싶은 것은 해당 엔드포인트에 대해 CORS 헤더를 활성화하는 것입니다.

자체 컨트롤러에 대해 다음과 같이 추가했습니다.@CrossOrigin컨트롤러 클래스에 대해서는 이러한 API에 CORS 헤더가 있으며, 이는 잘 작동합니다.그러나 Swagger JSON URL의 경우 제가 직접 컨트롤러를 작성하지 않았기 때문에 해당 주석을 사용할 수 없습니다.

다음 방법을 추가했습니다.SwaggerConfigSpring Framework의 CORS 지원에 있는 "글로벌 CORS 구성"에 설명된 바와 같이,

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        System.out.println("*** corsConfigurer called");
        return new WebMvcConfigurerAdapter() {
            @Override public void addCorsMappings(CorsRegistry registry) {
                System.out.println("*** addCorsMappings called");
                registry.addMapping("/v2/api-docs");
            }
        };
    }

두 가지 인쇄문이 모두 인쇄되므로 메소드가 호출됩니다.하지만 내가 컬로 URL을 부를 때:

curl -H "Origin: foo.com"  \
   -H "Access-Control-Request-Method: GET"   \
   -X OPTIONS \ 
   --verbose  \
   http://localhost:9274/v2/api-docs

CORS 헤더가 응답에 없습니다.(나만의 컨트롤러 방법과 달리, 다음과 같은 주석이 달렸습니다.@CrossOrigin응답에 CORS 헤더가 있습니다.)

저는 springfox-swagger2 버전 2.7.0과 spring-boot-starter-web 1.5.2를 사용하고 있습니다.

Swagger JSON API 엔드포인트에서 CORS 헤더를 활성화하려면 어떻게 해야 합니까?

웹 Mvc 구성이 아닌 일반적인 웹 필터가 필요할 것 같습니다.

@Bean
public CorsFilter corsFilter() {
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();

    // Allow anyone and anything access. Probably ok for Swagger spec
    CorsConfiguration config = new CorsConfiguration();
    config.setAllowCredentials(true);
    config.addAllowedOrigin("*");
    config.addAllowedHeader("*");
    config.addAllowedMethod("*");

    source.registerCorsConfiguration("/v2/api-docs", config);
    return new CorsFilter(source);
}

@Barath에게 답을 주셔서 감사합니다.해결책은 스프링 문서를 무시하는 것이었는데, 그 코드는 조용히 작동하지 않는 것처럼 보입니다.

(안타깝지만, Spring 내용은 작동할 때 상당히 고급입니다. 예를 들어, 사전 비행 요청에 대한 "Access-Control-Allow-Headers" 응답 헤더는 Java API 방법이 실제로 제공하는 헤더를 기반으로 설정됩니다.)

Spring의 CORS 실행을 무시하고 당신 자신의 실행을 하라.나는 나에게 효과가 있는 코드를 여기에 넣었습니다.

@Component
public class CorsFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
    throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest request = (HttpServletRequest) req;
        response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Allow-Headers", "Foo, Bar, Baz");
        chain.doFilter(req, res);
    }

    @Override
    public void init(FilterConfig filterConfig) {}

    @Override
    public void destroy() {}
}

아무 것이나 추가해야 합니다.@RequestHeader당신이 REST 방법으로 사용한 것.Access-Control-Allow-Headers응답 헤더

언급URL : https://stackoverflow.com/questions/45677048/how-do-i-enable-cors-headers-in-the-swagger-v2-api-docs-offered-by-springfox-sw

반응형