Swagger UI CORS配置Java CXF jersey REST API

时间:2015-04-23 10:27:57

标签: rest jersey jax-rs swagger swagger-ui

嗨,我有swagger UI的问题。我有与此类似的配置文件。

<bean id="resourceWriter" class="com.wordnik.swagger.jaxrs.listing.ResourceListingProvider" />
<bean id="apiWriter" class="com.wordnik.swagger.jaxrs.listing.ApiDeclarationProvider" />
<bean id="swaggerResourceJSON" class="com.wordnik.swagger.jaxrs.listing.ApiListingResourceJSON" />

<jaxrs:server id="swaggerAPI" address="/swagger">
    <jaxrs:serviceBeans>
        <ref bean="swaggerResourceJSON"/>
    </jaxrs:serviceBeans>
    <jaxrs:providers>
        <bean class="org.codehaus.jackson.jaxrs.JacksonJsonProvider"/>
        <bean class="com.ge.aviation.svc.fss.exception.WebExceptionHandler"/>
        <ref bean="resourceWriter"/>
        <ref bean="apiWriter"/>
    </jaxrs:providers>
</jaxrs:server>

<bean id="swaggerConfig" class="com.wordnik.swagger.jaxrs.config.BeanConfig">
    <property name="resourcePackage" value="package.of.my.service"/>
    <property name="version" value="1.0.0"/>
    <property name="basePath" value="http://localhost:8090/"/>
    <property name="title" value="Sample Service"/>
    <property name="description" value="Service for storing, searching, and retrieving files."/>
    <property name="contact" value="sup...@example.com"/>
    <property name="scan" value="true"/>
</bean>

然后我的服务器运行完美,并且有一个swagger UI的终点。 http://localhost:8095/api/api-docs/然后我在浏览器中复制此URL,它将显示Json文件。但是我已经在我的tomcat中复制了swagger UI dist文件(不是上面提到的同一服务器)然后添加上面的URL,然后IT说Can't read from server. It may not have the appropriate access-control-origin settings 。我发现错误的原因是https://github.com/swagger-api/swagger-ui/issues/146https://github.com/swagger-api/swagger-ui#cors-support但是我想知道如何为具有api-docs终点的ApiListingResourceJSON类设置cors。

2 个答案:

答案 0 :(得分:3)

swagger-core项目中的所有示例都包含一个示例文件管理器和配置如何启用CORS支持。

基本上,您需要创建以下过滤器:

public class ApiOriginFilter implements javax.servlet.Filter {
  @Override
  public void doFilter(ServletRequest request, ServletResponse response,
      FilterChain chain) throws IOException, ServletException {
    HttpServletResponse res = (HttpServletResponse) response;
    res.addHeader("Access-Control-Allow-Origin", "*");
    res.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
    res.addHeader("Access-Control-Allow-Headers", "Content-Type, api_key, Authorization");
    chain.doFilter(request, response);
  }

  @Override
  public void destroy() {
  }

  @Override
  public void init(FilterConfig filterConfig) throws ServletException {
  }
}

并将其添加到您的web.xml:

  <filter>
    <filter-name>ApiOriginFilter</filter-name>
    <filter-class>com.wordnik.swagger.sample.util.ApiOriginFilter</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>ApiOriginFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

当然,如果您不使用web.xml,可以选择其他方式来连接它,但这取决于您的使用案例。

通过添加所有内容,可以在整个应用程序中启用CORS。

答案 1 :(得分:2)

我已经用这种方式修复了问题。 Ron的答案也是正确的,但我没有使用任何web.xml配置。这是答案。org.apache.cxf.rs.security.cors.CrossOriginResourceSharingFilter添加到服务器作为提供和@CrossOriginResourceSharing(allowAllOrigins = true, allowCredentials = true)注释添加到REST API控制器。