提供静态内容的Springboot服务器问题

时间:2018-12-21 03:45:28

标签: spring spring-boot

我正在使用Spring Boot来提供静态内容。我的所有静态内容都在src/main/resources/static下。

我有如下简单的文件夹结构。我没有上下文路径。

static/index.html  (Default index page)
static/emp/index.html

通过访问localhost:8080,可以按预期放回index.html

但是,如果我访问localhost:8080/emp,则期望emp/index.html被送达,但没有发生。它返回错误信息there is no error default error page。它可以在其他静态Web服务器上正常工作。默认情况下,spring boot不为任何子文件夹提供index.html

2 个答案:

答案 0 :(得分:1)

已经回答here。 不是Spring Boot映射到index.html,而是servlet引擎(这是一个欢迎页面)。 (按照规范)只有一个欢迎页面,并且目录浏览不是容器的功能。

您可以手动添加视图控制器映射以完成此工作:

@Configuration
public class CustomWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/emp").setViewName("redirect:/emp/"); //delete these two lines if looping with directory as below
        registry.addViewController("/emp/").setViewName("forward:/emp/index.html"); //delete these two lines if looping with directory as below

        String[] directories = listDirectories("/");
        for (String subDir : directories){
            registry.addViewController(subDir).setViewName("redirect:/" + subDir + "/");
            registry.addViewController(subDir).setViewName("forward:/" + subDir + "/index.html");
        }

    super.addViewControllers(registry);
    }
}

     /**
     * Resources mapping
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {          
            registry.addResourceHandler("/css/**").addResourceLocations("classpath:/assets/css/"); //my css are in src/resources/assets/css that's why given like this.
            registry.addResourceHandler("/emp/**").addResourceLocations("classpath:/emp/");
            registry.addResourceHandler("/images/**").addResourceLocations("classpath:/assets/images/");
            registry.addResourceHandler("/js/**").addResourceLocations("classpath:/assets/js/");
    }

    /***
    This should list subdirectories under the root directory you provide.
    //Not tested
    ***/
    private String[] listDirectories(String root){
        File file = new File(root);
        String[] directories = file.list(new FilenameFilter() {

      @Override
      public boolean accept(File current, String name) {
        return new File(current, name).isDirectory();
      }
    });
    }

如果请求/emp(不带斜杠),则第一个映射使Spring MVC向客户端发送重定向。如果您在/emp/index.html中有相对链接,这是必需的。第二个映射将内部的任何请求转发到/emp/(不向客户端发送重定向)到index.html子目录中的emp

您将收到错误消息there is no default error page,因为您正在尝试访问尚未配置的localhost:8080/emp/。因此spring-boot将检查是否配置了任何错误页面。由于您还没有配置错误页面,因此您遇到了上述错误。

答案 1 :(得分:0)

将index.html页面移动到resources / template文件夹,并将CSS和其他文件放入静态文件夹