2017-08-14 3 views
1

J'ai le fichier suivant dans mon projet:Comment activer les en-têtes CORS dans les fichiers Swagger/v2/api-doc proposés par Springfox Swagger?

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

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

Et dans le Application.java il y a:

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

Le Swagger JSON est disponible sous /v2/api-docs, qui fonctionne très bien.

Ce que je voudrais faire est d'activer les en-têtes CORS pour ce point de terminaison.

Pour mes propres contrôleurs, j'ai ajouté @CrossOrigin aux classes de contrôleur, ces API ont alors des en-têtes CORS, cela fonctionne très bien. Mais pour l'URL Swagger JSON, je n'ai pas écrit de contrôleur moi-même, donc je ne peux pas utiliser cette annotation.

J'ai ajouté la méthode suivante au SwaggerConfig, comme décrit dans "Configuration globale CORS" dans CORS support in Spring Framework.

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

Les deux instructions d'impression sont imprimées et la méthode est appelée. Mais quand je l'appelle l'URL avec boucle:

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

Les en-têtes CORS ne sont pas dans la réponse. (Contrairement à mes propres méthodes de contrôleur, annotées avec @CrossOrigin, où la réponse a les en-têtes CORS.)

J'utilise springfox-swagger2 version 2.7.0 et spring-boot-starter-web 1.5.2.

Que puis-je faire pour activer les en-têtes CORS sur le point de terminaison Swagger JSON API?

+0

Avez-vous essayé d'inclure CORSFilter simples en place décrit ici https://stackoverflow.com/questions/32084925/simplecorsfilter-not-working? – Barath

+0

http://grokbase.com/t/gg/swagger-swaggersocket/1579hd7hzy/swagger-ui-from-multiple-microservices-springmvc/157e1j8xqn#157e1j8xqn – surya

+0

@surya - Merci pour le lien, mais ma question concerne le Swagger Fichier JSON à/v2/api-docs, par opposition à la swagger-ui (je n'utilise pas swagger-ui). –

Répondre

3

Je pense que vous avez besoin d'un filtre Web générique par opposition à la configuration Web 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); 
} 
+0

Où puis-je obtenir l'objet 'jHipsterProperties'? Je n'utilise pas JHipster. Just Spring Boot, avec Spring REST, avec Springfox Swagger fournissant l'URL '/ v2/api-docs'. –

+1

@AdrianSmith désolé j'ai bourré une pâte. Correction de la réponse Voir la mise à jour. – Strelok

+0

Merci qui fonctionne un régal :) Passé toute l'après-midi hier à ce sujet. Merci! J'ai utilisé 'new CorsConfiguration(). ApplyPermitDefaultValues ​​()' à la fin. –

0

Merci à @Barath pour la réponse. La solution était d'ignorer la documentation de Spring, ce code semble ne pas fonctionner en silence.

(C'est un peu dommage, le Spring est assez avancé quand il fonctionne, par exemple, l'en-tête de réponse "Access-Control-Allow-Headers" à la demande de pré-vol est basé sur ce que l'API Java La méthode offre réellement.)

Ignorez l'implémentation de CORS Spring et faites la vôtre. J'ai mis le code ici qui a fonctionné pour moi:

@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() {} 
} 

Rappelez-vous d'ajouter un @RequestHeader que vous avez utilisé dans toute méthode REST à l'en-tête de réponse Access-Control-Allow-Headers