2017-08-14 77 views
1

我有以下的文件在我的項目:如何在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 { 
    ... 
} 

招搖JSON是/v2/api-docs下可用,工作正常。

我想要做的是啓用該端點的CORS頭。

對於我自己的控制器,我已經將@CrossOrigin添加到控制器類,那些API然後具有CORS標題,可以正常工作。但對於Swagger JSON URL,我自己並沒有編寫控制器,所以我不能使用該註釋。

我已將以下方法添加到SwaggerConfig,如CORS support in Spring Framework中的「Global 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"); 
      } 
     }; 
    } 

這兩個打印語句都打印出來,所以調用該方法。但是當我使用curl調用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頭文件?

+0

你試圖包括代替簡單CORSFilter任何@RequestHeader在這裏描述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 - 感謝您的鏈接,但我的問題是關於Swagger JSON文件位於/ v2/api-docs,而不是swagger-ui(我沒有使用swagger-ui)。 –

回答

3

我認爲你需要一個通用的網頁過濾器,而不是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

我在哪裏可以獲得對象'jHipsterProperties'?我沒有使用JHipster。使用Spring REST,Spring Spring Swagger提供'/ v2/api-docs' URL。 –

+1

@AdrianSmith對不起,我塞了一個貼。修復了答案。查看更新。 – Strelok

+0

謝謝你的工作:)昨天整個下午花了這個。謝謝!我最後使用了'new CorsConfiguration()。applyPermitDefaultValues()'。 –

0

感謝@Barath的答案。解決方案是忽略Spring文檔,該代碼似乎默默無聞。 (這很遺憾,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() {} 
} 

記住補充說,你在任何REST方法用於對Access-Control-Allow-Headers響應頭

相關問題