73

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

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

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

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

4

12 回答 12

78

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

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

Spring Boot中有一些关于此的文档,但它实际上只是一个普通的 Spring MVC 功能。

此外,由于 spring boot 1.2(我认为)你可以简单地设置spring.resources.staticLocations.

于 2014-01-14T21:39:22.803 回答
35

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 映射的期望)。
  • 考虑查看WebMvcAutoConfigurationAdapter的源代码。
于 2014-11-14T21:46:31.977 回答
21

基于@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");
 }
}

这使我可以使用以下参数启动我的 Spring Boot 应用--static.path程序

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

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

于 2015-05-15T10:14:37.380 回答
9

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

于 2015-11-22T05:59:14.587 回答
9
  • 操作系统:赢 10
  • 春季启动:2.1.2

我想从 c:/images 提供静态内容

添加此属性对我有用:

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

我在 Spring Boot Doc附录 A中找到了该属性的原始值

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

于 2019-04-02T20:22:04.640 回答
8

@Mark Schäfer

永远不会太晚,但/在静态之后添加一个斜杠 ( ):

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

所以http://<host>/index.html现在可以访问了。

于 2018-03-23T18:46:06.070 回答
8

基于@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);

  }

}
于 2019-01-16T07:03:44.613 回答
2

从文件系统提供服务

我添加spring.resources.static-location=file:../frontend/buildapplication.properties

index.html存在于build文件夹中

使用还可以添加绝对路径

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

我认为同样你可以尝试添加 Dropbox 文件夹路径。

于 2018-05-09T11:21:08.003 回答
1

对于当前的 Spring-Boot 版本 1.5.3,参数为

spring.resources.static-locations

更新 我配置

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

并希望在调用时将我的 index.html 放在此文件夹中

http://<host>/index.html

这没有用。我必须在 URL中包含文件夹名称:

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

于 2017-06-02T10:41:52.860 回答
1

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

report.location=file:/Users/bill/report/html/
spring.thymeleaf.prefix=${report.location}
于 2018-05-31T20:20:06.567 回答
1

请注意,现在不推荐使用 WebMvcConfigurerAdapter(请参阅WebMvcConfigurerAdapter)。由于 Java 8 默认方法,您只需实现WebMvcConfigurer

于 2018-06-15T09:31:20.753 回答
0

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

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

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

此文件夹中的资源将在以下位置提供(例如,用于下载):

http://<host>:<port>/<context>/your_file.csv
于 2019-09-19T16:19:10.037 回答