如何使用 SpringBoot 服务位于 Dropbox 文件夹中的静态内容?

我有一个 Spring Boot web 应用程序,我想在我的 Linode VPS (~/Dropbox/images)上的一个共享 Dropbox 目录中提供静态内容。我读到 SpringBoot 会自动提供静态内容

"classpath:/META-INF/resources/",
"classpath:/resources/",
"classpath:/static/",
"classpath:/public/",

但是当然我的 Dropbox 目录不在类路径上。

虽然我可以配置 Apache 为我的 Dropbox 文件夹中的图像提供服务,但是我想利用 Spring Security 来限制经过身份验证的用户对静态内容的访问。

134167 次浏览

您可以添加自己的静态资源处理程序(它覆盖默认值) ,例如。

@Configuration
public class StaticResourceConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations("file:/path/to/my/dropbox/");
}
}

弹簧靴中有一些关于这方面的文档,但它实际上只是一个普通的 Spring MVC 特性。

此外,由于春季启动1.2(我认为) ,您可以简单地设置 spring.resources.staticLocations

Springboot (通过 Spring)现在使添加到现有资源处理程序变得很容易。参见 Dave Syers 回答。要添加到现有的静态资源处理程序,只需确保使用不重写现有路径的资源处理程序路径。

下面的两个“也”注释仍然有效。

. . .

[编辑: 下面的方法不再有效]

如果您希望 延伸是默认的静态资源处理程序,那么这样的方法似乎可以奏效:

@Configuration
@AutoConfigureAfter(DispatcherServletAutoConfiguration.class)
public class CustomWebMvcAutoConfig extends
WebMvcAutoConfiguration.WebMvcAutoConfigurationAdapter {


@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
String myExternalFilePath = "file:///C:/Temp/whatever/m/";


registry.addResourceHandler("/m/**").addResourceLocations(myExternalFilePath);


super.addResourceHandlers(registry);
}


}

super.addResourceHandlers的调用设置默认处理程序。

另外:

  • 注意外部文件路径的尾部斜杠(取决于您对 URL 映射的期望)。
  • 考虑检查 配置适配器的源代码。

根据@Dave Syers 的回答,我在 Spring Boot 项目中添加了以下类:

@Configuration
public class StaticResourceConfiguration extends WebMvcConfigurerAdapter {


private static final Logger LOG = LoggerFactory.getLogger(StaticResourceConfiguration.class);


@Value("${static.path}")
private String staticPath;


@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {


if(staticPath != null) {
LOG.info("Serving static content from " + staticPath);
registry.addResourceHandler("/**").addResourceLocations("file:" + staticPath);
}
}


// see https://stackoverflow.com/questions/27381781/java-spring-boot-how-to-map-my-my-app-root-to-index-html
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("redirect:/index.html");
}
}

这允许我使用参数 --static.path启动我的春季启动应用程序,如

java -jar spring-app-1.0-SNAPSHOT.jar --static.path=/path/to/my/static-files/

这对于开发和测试非常方便。

有一个属性 spring.resources.staticLocations可以在 application.properties中设置。注意,这将覆盖默认位置。参见 org.springframework.boot.autoconfigure.web.ResourceProperties

对于当前的 Spring-Boot Version 1.5.3,参数是

spring.resources.static-locations

更新 我配置好了

“ spring.resources. static-location = file:/opt/x/y/z/static”

并希望在调用时将 index.html 放在这个文件夹中

http://<host>/index.html

这没有工作。我必须在网址中包括 文件夹名:

http://<host>/static/index.html

@ Mark Schafer

永远不会太晚,但是在 static 后面加一个斜杠(/) :

spring.resources.static-locations=file:/opt/x/y/z/static/

现在可以连接到 http://<host>/index.html了。

从文件系统提供服务

我在 application.properties中加入了 spring.resources.static-location=file:../frontend/build

index.htmlbuild文件夹中

使用还可以添加绝对路径

spring.resources.static-location=file:/User/XYZ/Desktop/frontend/build

我认为类似地,您可以尝试添加 Dropbox 文件夹路径。

FWIW,我在上面推荐的 spring.resources.static-locations上没有任何成功; 对我有效的是设置 spring.thymeleaf.prefix:

report.location=file:/Users/bill/report/html/
spring.thymeleaf.prefix=${report.location}

请注意,WebMvcConfigurerAdapter 现在不推荐使用(参见 WebMvcConfigurerAdapter)。

根据@Dave Syer,@kaliatech 和@asmaier 的回答,springboot v2 + 版本的方式是:

@Configuration
@AutoConfigureAfter(DispatcherServletAutoConfiguration.class)
public class StaticResourceConfiguration implements WebMvcConfigurer  {


@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
String myExternalFilePath = "file:///C:/temp/whatever/m/";


registry.addResourceHandler("/m/**").addResourceLocations(myExternalFilePath);


}


}
  • 操作系统: Win 10
  • SpringBoot: 2.1.2

我想提供来自 c:/images 的静态内容

添加这个属性对我很有用:

spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:///C:/images/

我在 SpringBootDoc附录 A中找到了属性的原始值

这将使 c:/images/image. jpg 可以作为 http://localhost:8080/image.jpg访问

您可以将文件夹放置在 ServletContext 的根目录中。

然后在 application.yml 中指定到该目录的相对路径或绝对路径:

spring:
resources:
static-locations: file:some_temp_files/

此文件夹中的资源可在以下位置获得(例如,用于下载) :

http://<host>:<port>/<context>/your_file.csv