我有一个带有嵌入式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");
}
}
答案 0 :(得分:0)
以与SpringBoot Embedded Tomcat JSPServlet Options相同的方式,您可以使用EmbeddedServletContainerCustomizer
@Bean
查找默认servlet并配置其init参数。
@Bean
public EmbeddedServletContainerCustomizer customizer() {
return new EmbeddedServletContainerCustomizer() {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
if (container instanceof TomcatEmbeddedServletContainerFactory) {
customizeTomcat((TomcatEmbeddedServletContainerFactory) container);
}
}
private void customizeTomcat(TomcatEmbeddedServletContainerFactory tomcat) {
tomcat.addContextCustomizers(new TomcatContextCustomizer() {
@Override
public void customize(Context context) {
Wrapper defServlet = (Wrapper) context.findChild("default");
defServlet.addInitParameter("listings", "true");
}
});
}
};
}
感谢Andy Wilkinson。
答案 1 :(得分:0)
在springboot / **中映射到ResourceHttpRequestHandler。调用永远不会被委托给DefaultServlet以使列表生效。我不得不再对Mark的解决方案进行两次调整才能让它发挥作用。
提供静态内容的文档库是一个tmp文件夹。我必须将它设置为存在静态内容的文件夹。
public void customize(Context context) {
context.setDocBase("../../../mytest");
Wrapper defServlet = (Wrapper) context.findChild("default");
defServlet.addInitParameter("listings", "true");
defServlet.addInitParameter("readOnly", "false");
defServlet.addMapping("/static/*");
}
Deployment folder structure
/myhome/mytest
----myapp.jar
----/tomcat/webapps
----/static
--------All static files go here
application.yml
server :
tomcat :
basedir : tomcat
Current working dir to run the app /myhome/mytest
url to test : http://localhost:8080/static
答案 2 :(得分:0)
已针对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);
}
}