java - 用于 spring-boot 应用程序的嵌入式 Tomcat 目录列表

标签 java spring spring-mvc tomcat spring-boot

我有一个带有嵌入式 Tomcat 的 spring boot 应用程序。 我想通过 tomcat 目录列表从不同的位置公开一些图像文件和文件夹。所以我在名为

的配置文件中添加了以下内容
public class AppConfig extends WebMvcConfigurerAdapter

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/images/**").addResourceLocations("file:///xxx/yyy/images/");
    }
}

如果我知道名称,我现在可以访问单个图像。

示例:localhost:8080/images/file.jpg。

但由于目录列表默认为 false,我无法通过“localhost:8080/images/”访问图像列表以了解所有可用图像。

我也尝试了以下选项来添加列表,但没有用。

public class MyApplication implements ServletContextInitializer{

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

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        servletContext.setInitParameter("listings", "true");
    }
}

最佳答案

针对 Spring 2.1 进行了更新

import org.apache.catalina.Context;
import org.apache.catalina.Wrapper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.stereotype.Component;

@Component
public class MyTomcatWebServerCustomizer implements WebServerFactoryCustomizer<TomcatServletWebServerFactory>  {

    @Value("${tomcat.file.base}")  // C:\\some\\parent\\child
    String tomcatBaseDir;

    @Override
    public void customize(TomcatServletWebServerFactory factory) {
        // customize the factory here
        TomcatContextCustomizer tomcatContextCustomizer = new TomcatContextCustomizer() {
            @Override
            public void customize(Context context) {
                String parentFolder = tomcatBaseDir.substring(0,tomcatBaseDir.lastIndexOf("\\"));
                String childFolder = tomcatBaseDir.substring(tomcatBaseDir.lastIndexOf("\\") + 1);
                context.setDocBase(parentFolder);
                Wrapper defServlet = (Wrapper) context.findChild("default");
                defServlet.addInitParameter("listings", "true");
                defServlet.addInitParameter("readOnly", "false");
                defServlet.addMapping("/"+ childFolder + "/*");
            }
        };
        factory.addContextCustomizers(tomcatContextCustomizer);

    }
}

关于java - 用于 spring-boot 应用程序的嵌入式 Tomcat 目录列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35004870/

相关文章:

java - Android Intent 和这个新 Intent 的对象(实例)

Spring Boot 2.0.3 缺少 Spring Security oauth2 'dependencies.dependency.version'

java - 使用 spring mvc 在浏览器上显示欢迎消息

java - Spring JMX - 将包中的类注册为 MBean

java - 如何获取有效的 Alfresco 应用程序上下文来创建文件夹?

java - 带有嵌入式 tomcat 的 Spring Boot 应用程序

java - 如何传输参数到重定向jsp,该参数可以访问到该jsp

java - 如何在其基类中创建子类对象?

java - 在同一台机器上多次安装 Java

java - 动态壁纸设置按钮不起作用