Springfox swagger-ui.html无法推断基本网址 - 由丢失的Cookie

时间:2018-03-07 15:20:42

标签: spring spring-boot swagger swagger-ui springfox

我们在API网关后面有Spring Boot服务。使用早期版本的Springfox - 2.1.2,我们在加载swagger-ui.html页面时没有遇到任何问题。这适用于Spring Boot 1.4.3.RELEASE。从那时起,我们已升级到Boot 1.5.7并将Springfox升级到2.8.0。

现在,如果我们加载页面,我们会收到一个警告框,其中包含以下长消息。

  

无法推断基本网址。这在使用动态servlet时很常见   注册或API在API网关后面。基本网址是   服务所有招摇资源的根源。对于例如如果   api可以在http://example.org/api/v2/api-docs获得   基本网址为http://example.org/api/。请输入位置   手动

我在网上搜索了一些提示,但似乎这些情况并不适用于我们。首先,如果我简单地恢复版本,它将通过相同的API网关重新开始工作。

跟踪流量,似乎调用.html页面生成的三个XHR资源导致问题。这些是从我们的API网关返回401。他们返回401的原因是因为cookie没有被传递。

这三个电话是:

如果我将这些URL作为纯浏览器请求加载 - 它们可以正常工作 - 因为会发送cookie。

我怀疑CORS是否适用,因为HTML是从与swagger JSON和实际服务调用相同的地址提供的。

知道为什么会这样吗?有人遇到类似问题吗?解决方法的建议?非常感谢。

15 个答案:

答案 0 :(得分:4)

添加安全配置-跳过以下用于身份验证的URL ::

private static final String[] AUTH_WHITELIST = {
        "/swagger-resources/**",
        "/swagger-ui.html",
        "/v2/api-docs",
        "/webjars/**"
};

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers(AUTH_WHITELIST);
}

答案 1 :(得分:2)

见以下编辑

你使用弹簧安全吗?

如果是,可能你会跳过这样的资源(对吧?): "/swagger-resources/**", "/swagger-ui.html", "/v2/api-docs", "/webjars/**"

尝试将其"/swagger-resources/**"更改为"**/swagger-resources/**"

我对swagger的具体安全配置是:

private static final String[] AUTH_LIST = {
        // -- swagger ui
        "**/swagger-resources/**",
        "/swagger-ui.html",
        "/v2/api-docs",
        "/webjars/**"
};

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
    .authorizeRequests().antMatchers(AUTH_LIST).authenticated()
    .and()
    .httpBasic().authenticationEntryPoint(swaggerAuthenticationEntryPoint())
    .and()
    .csrf().disable();
}

@Bean
public BasicAuthenticationEntryPoint swaggerAuthenticationEntryPoint() {
    BasicAuthenticationEntryPoint entryPoint = new BasicAuthenticationEntryPoint();
    entryPoint.setRealmName("Swagger Realm");
    return entryPoint;
}

如果您需要/希望我可以将示例项目发送到GitHub,以便您了解有关我的安全/ swagger配置的更多信息。

编辑2018/04/10

此问题是由springfox中的错误版本引起的。 See this issue on github to solve the problem

致后代:

在pom.xml中

...
<repositories>
    <repository>
        <id>swagger</id>
        <name>swagger</name>
        <url>http://oss.jfrog.org/artifactory/oss-snapshot-local</url>
    </repository>
</repositories>
...
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>2.8.1-SNAPSHOT</version>
</dependency>
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger-ui</artifactId>
    <version>2.8.1-SNAPSHOT</version>
</dependency>
...

扩展WebSecurityConfigAdapter的类:

@Configuration
public class WebSecurityConfigEntryPointApplication extends WebSecurityConfigurerAdapter {

    private static final List<String> AUTH_LIST = Arrays.asList(
            "/swagger-resources/**",
            "/swagger-ui.html**",
            "/webjars/**",
            "favicon.ico");

    @Autowired
    private RestAuthenticationEntryPoint restAuthenticationEntryPoint;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .antMatcher("/**").authorizeRequests().anyRequest().authenticated()
                .and()
                .exceptionHandling()
                .defaultAuthenticationEntryPointFor(swaggerAuthenticationEntryPoint(), new CustomRequestMatcher(AUTH_LIST))
                .and()
                .httpBasic()
                .authenticationEntryPoint(restAuthenticationEntryPoint)
                .and()
                .csrf().disable();
    }

    @Bean
    public BasicAuthenticationEntryPoint swaggerAuthenticationEntryPoint() {
        BasicAuthenticationEntryPoint entryPoint = new BasicAuthenticationEntryPoint();
        entryPoint.setRealmName("Swagger Realm");
        return entryPoint;
    }

    private class CustomRequestMatcher implements RequestMatcher {

        private List<AntPathRequestMatcher> matchers;

        private CustomRequestMatcher(List<String> matchers) {
            this.matchers = matchers.stream().map(AntPathRequestMatcher::new).collect(Collectors.toList());
        }

        @Override
        public boolean matches(HttpServletRequest request) {
            return matchers.stream().anyMatch(a -> a.matches(request));
        }

    }

}

RestAuthenticationEntryPoint:

@Component
public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint {

    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException {
        response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized");
    }
}

答案 2 :(得分:2)

这发生在我身上,我使用的是SpringBoot 1.5.16和Springfox 2.9.1。

在我的application.properties中,我已经定义了server.servlet-path=/api,但是,以某种方式,swagger-ui忽略了所定义的值。我尝试了许多不同的方法来完成这项工作,最后我找到了一种解决方法:

 @Configuration
 @EnableSwagger2
 public class SwaggerConfiguration extends WebMvcConfigurationSupport {                                    

    @Bean
    public Docket apiMonitoramento() { 
        return new Docket(DocumentationType.SWAGGER_2)
                .select()                                  
                .apis(RequestHandlerSelectors.any())
                .paths(PathSelectors.any())                          
                .build()    
                .apiInfo(apiInfo());
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()              
                .title("REST API")
                .description("Servicesx")               
                .build();
    }

    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("swagger-ui.html")
                .addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");
    }
 }

我正在访问http://localhost:8080/context/swagger-ui.html,但是使用该配置,正确的URL是:http://localhost:8080/context/api/swagger-ui.html

答案 3 :(得分:2)

将springfox-swagger2和springfox-swagger-ui依赖项升级到2.9.2,并确保已正确提供basePackage

return new Docket(DocumentationType.SWAGGER_2).select()
            .apis(RequestHandlerSelectors
                .basePackage("org.abc.xyz.controller"))
            .paths(PathSelectors.regex("/.*"))
            .build().apiInfo(apiEndPointsInfo());

答案 4 :(得分:1)

在spring boot类中添加以下注释对我来说解决了这个问题。

  

@ EnableSwagger2

我正在使用摇摇欲坠的版本

 <version>2.9.2</version>

答案 5 :(得分:0)

尝试使用端口8080-将其更改为8080后为我工作

答案 6 :(得分:0)

如果不指定任何特殊的组件扫描选项,则将带有@ EnableSwagger2批注的类放在Spring Boot Application类(@SpringBootApplication)的层次结构之外的包中,将会遇到此问题。

假设您的Spring Boot Application类位于“ de.oopexpert.app”中,然后将带注释的@ EnableSwagger2类放入...

  • de.oopexpert.app将正常工作
  • de.oopexpert.app.config将正常工作
  • de.oopexpert.config将起作用

您可以通过添加@ComponentScan(basePackages = {“ de.oopexpert”})来调整组件扫描选项,以指定层次结构的其他根。

答案 7 :(得分:0)

我不使用Spring Security发生了这个问题。我的项目使用Maven多个模块,当访问localhost:8080 / swagger-ui.html发生此问题时,首先在SwaggerConf类中添加@ EnableSwagger2,最后将@EnableSwagger移至SpringBoot Application类,此问题已解决。 首先:

@Configuration
@EnableSwagger2
public class SwaggerConfig {

    @Bean
    public Docket api(){
        return new Docket(DocumentationType.SWAGGER_2)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.zuoyan."))
                .paths(PathSelectors.any())
                .build();
    }

}

最后:

 @SpringBootApplication(scanBasePackages = {"com.zuoyan.springboot.appmissionhall"})
 @EnableSwagger2
public class ApplicationStartUpApplication {
    public static void main(String[] args) {
        SpringApplication.run(ApplicationStartUpApplication.class, args);
    }

}

答案 8 :(得分:0)

我将@EnableSwagger2WebMvc添加到App类进行修复。我正在使用Spring Boot 2.3.0.BUILD-SNAPSHOT和io.springfox 3.0.0-SNAPSHOT。 SpringFoxConfig类保持不变。

package com.telixia.educare.academy;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;

@EnableSwagger2WebMvc
@SpringBootApplication
public class AcademyApplication {

    public static void main(String[] args) {
        SpringApplication.run(AcademyApplication.class, args);
    }

}

答案 9 :(得分:0)

这也可能是由springfox-swagger-ui中的springfox-swagger2pom.xml版本不匹配引起的,例如,如果您更新了一个但忘了更新另一个:

<dependency>
  <groupId>io.springfox</groupId>
  <artifactId>springfox-swagger2</artifactId>
  <version>2.6.1</version>
</dependency>
<dependency>
  <groupId>io.springfox</groupId>
  <artifactId>springfox-swagger-ui</artifactId>
  <version>2.9.2</version>
</dependency>

您需要确保springfox-swagger-uispringfox-swagger2具有相同的版本。

答案 10 :(得分:0)

https://stackoverflow.com/a/56716898/13347514到主应用程序类中添加@EnableSwagger2WebMvc@Import(SpringDataRestConfiguration.class)的解决方案解决了我的问题:

@SpringBootApplication
@EnableSwagger2WebMvc
@Import(SpringDataRestConfiguration.class)
public class MyApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }

}

答案 11 :(得分:0)

在许多情况下,这是由于Java版本不兼容所致。很多时候它不适用于Java 11,请尝试使用Java 8

答案 12 :(得分:0)

首先确保添加了这两个依赖项,然后使用@ EnableSwagger2注释主SpringBootApplication类,然后将解决您的问题。

    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>2.9.2</version>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>2.9.2</version>
    </dependency>

Screen shot of main SpringBootApplication class

答案 13 :(得分:0)

我在使用基本 Spring MVC 应用程序(没有 Spring Security)时遇到了同样的问题。

我换了

  @Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.
        addResourceHandler("/swagger-ui/**")
        .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/")
        .resourceChain(false);
  }

  @Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.
        addResourceHandler("/swagger-ui/**")
        .addResourceLocations("classpath:/META-INF/resources/");
            registry.addResourceHandler("**/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");

  }

它成功了

答案 14 :(得分:-1)

就我而言,问题的原因是:

@ComponentScan(basePackageClasses = {ApplicationRoot.class })

在两个Java文件中两次。

删除多余的一个后,问题消失了。