如何使用Spring Boot来提供位于Dropbox文件夹中的静态内容?

Sha*_*ick 62 apache spring-mvc dropbox static-content spring-boot

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

"classpath:/META-INF/resources/",
"classpath:/resources/",
"classpath:/static/",
"classpath:/public/",
Run Code Online (Sandbox Code Playgroud)

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

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

Dav*_*yer 67

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

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

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

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

  • 正如@kaliatech所提到的,不要忘记资源位置路径上的尾部斜杠. (5认同)

kal*_*ech 32

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);
  }

}
Run Code Online (Sandbox Code Playgroud)

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

也:


asm*_*ier 19

根据@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");
 }
}
Run Code Online (Sandbox Code Playgroud)

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

java -jar spring-app-1.0-SNAPSHOT.jar --static.path=/path/to/my/static-files/
Run Code Online (Sandbox Code Playgroud)

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


Igo*_*ski 9

  • 操作系统:Win 10
  • 弹簧靴:2.1.2

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

添加此属性对我有用:

spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:///C:/images/
Run Code Online (Sandbox Code Playgroud)

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

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

  • `spring.resources.static-locations` 已弃用,但您可以使用 `spring.web.resources.static-locations` 代替。 (2认同)

Abh*_*kar 7

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


s.i*_*pma 6

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

  }

}
Run Code Online (Sandbox Code Playgroud)

  • `@AutoConfigureAfter(DispatcherServletAutoConfiguration.class)` 添加这个拯救了我的日子。谢谢 (2认同)

小智 5

@马克·谢弗

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

spring.resources.static-locations=file:/opt/x/y/z/static/
Run Code Online (Sandbox Code Playgroud)

所以http://<host>/index.html现在可以到达。