J'ai une application Web Spring Boot et je souhaite diffuser du contenu statique situé dans un répertoire Dropbox partagé sur mon VPS Linode (~/Dropbox/images). J'ai lu que Spring Boot servira automatiquement le contenu statique de
"classpath:/META-INF/resources/",
"classpath:/resources/",
"classpath:/static/",
"classpath:/public/",
mais bien sûr, mon répertoire Dropbox n'est pas sur le classpath.
Bien que je puisse configurer Apache pour servir les images dans mon dossier Dropbox, je voudrais profiter de Spring Security pour limiter l'accès du contenu statique aux utilisateurs authentifiés.
Vous pouvez ajouter votre propre gestionnaire de ressources statiques (il écrase les valeurs par défaut), par exemple.
@Configuration
public class StaticResourceConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations("file:/path/to/my/dropbox/");
}
}
Il existe un peu de documentation à ce sujet dans Spring Boot , mais il s’agit en réalité d’une fonctionnalité MVC de Vanilla Spring.
En outre, depuis le démarrage de printemps 1.2 (je pense), vous pouvez simplement définir spring.resources.staticLocations
.
Springboot (via Spring) facilite désormais l’ajout aux gestionnaires de ressources existants. Voir Dave Syers answer . Pour ajouter aux gestionnaires de ressources statiques existants, veillez simplement à utiliser un chemin de gestionnaire de ressources qui ne remplace pas les chemins existants.
Les deux notes "aussi" ci-dessous sont toujours valables.
. . .
[Modifier: l'approche ci-dessous n'est plus valable]
Si vous voulez étendre les gestionnaires de ressources statiques par défaut, quelque chose comme cela semble fonctionner:
@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);
}
}
L'appel à super.addResourceHandlers
configure les gestionnaires par défaut.
Aussi:
Basé sur @Dave Syers answer, j'ajoute la classe suivante à mon projet 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");
}
}
Cela me permet de démarrer mon application de démarrage de printemps avec le paramètre --static.path
comme
Java -jar spring-app-1.0-SNAPSHOT.jar --static.path=/path/to/my/static-files/
Cela peut être très utile pour le développement et les tests.
Il y a une propriété spring.resources.staticLocations
qui peut être défini dans le application.properties
. Notez que cela remplacera les emplacements par défaut. Voir org.springframework.boot.autoconfigure.web.ResourceProperties
.
Basé sur @Dave Syer, @kaliatech et @asmaier répondent que la méthode springboot v2 + serait:
@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);
}
}
@ Mark Schäfer
Jamais trop tard, mais ajoutez une barre oblique (/
) après statique:
spring.resources.static-locations=file:/opt/x/y/z/static/
Alors http://<Host>/index.html
est maintenant accessible.
Pour la version actuelle de Spring-Boot 1.5.3, le paramètre est
spring.resources.static-locations
Mise à jour J'ai configuré
`spring.resources.static-locations = fichier:/opt/x/y/z/statique``
et espère obtenir mon index.html vivant dans ce dossier lors de l'appel
http://<Host>/index.html
Cela n'a pas fonctionné. Je devais inclure le nom du dossier dans l'URL:
http://<Host>/static/index.html
Je voulais servir du contenu statique à partir de c:/images
Ajouter cette propriété a fonctionné pour moi:
spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:///C:/images/
J'ai trouvé la valeur d'origine de la propriété dans le document Spring Boot Doc Annexe A
Cela rendra c: /images/image.jpg accessible en tant que http: // localhost: 8080/image.jpg
Servir depuis un système de fichiers
J'ai ajouté spring.resources.static-location=file:../frontend/build
dans application.properties
index.html
est présent dans le dossier build
Utilisation peut également ajouter un chemin absolu
spring.resources.static-location=file:/User/XYZ/Desktop/frontend/build
Je pense que de même, vous pouvez essayer d'ajouter le chemin du dossier Dropbox.
Notez que WebMvcConfigurerAdapter est maintenant obsolète (voir WebMvcConfigurerAdapter ). En raison de Java 8 méthodes par défaut, il vous suffit de mettre en œuvre WebMvcConfigurer .
FWIW, je n’ai eu aucun succès avec le spring.resources.static-locations
recommandé ci-dessus; ce qui a fonctionné pour moi, c’était de mettre spring.thymeleaf.prefix:
report.location=file:/Users/bill/report/html/
spring.thymeleaf.prefix=${report.location}