添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement . We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
public class MyWebAppConfigurer 
        extends WebMvcConfigurerAdapter {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/myres/**").addResourceLocations("classpath:/myres/");
        super.addResourceHandlers(registry);

访问myres 文件夹中的fengjing.jpg 图片的地址为 http://localhost:8080/myres/fengjing.jpg
这样使用代码的方式自定义目录映射,并不影响Spring Boot的默认映射,可以同时使用。

如果我们将/myres/* 修改为 /* 与默认的相同时,则会覆盖系统的配置,可以多次使用 addResourceLocations 添加目录,优先级先添加的高于后添加的。

// 访问myres根目录下的fengjing.jpg 的URL为 http://localhost:8080/fengjing.jpg (/** 会覆盖系统默认的配置)
// registry.addResourceHandler("/**").addResourceLocations("classpath:/myres/").addResourceLocations("classpath:/static/");

其中 addResourceLocations 的参数是动参,可以这样写 addResourceLocations(“classpath:/img1/”, “classpath:/img2/”, “classpath:/img3/”);

通过配置文件配置

上面是使用代码来定义静态资源的映射,其实Spring Boot也为我们提供了可以直接在 application.properties(或.yml)中配置的方法。
配置方法如下:

# 默认值为 /**
spring.mvc.static-path-pattern=
# 默认值为 classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/ 
spring.resources.static-locations=这里设置要指向的路径,多个使用英文逗号隔开,

使用 spring.mvc.static-path-pattern 可以重新定义pattern,如修改为 /myres/** ,则访问static 等目录下的fengjing.jpg文件应该为 http://localhost:8080/myres/fengjing.jpg ,修改之前为 http://localhost:8080/fengjing.jpg
使用 spring.resources.static-locations 可以重新定义 pattern 所指向的路径,支持 classpath: 和 file: (上面已经做过说明)
注意 spring.mvc.static-path-pattern 只可以定义一个,目前不支持多个逗号分割的方式。

SpringBoot添加对静态文件css/html/jpg等的直接访问的支持
http://www.cnblogs.com/wangnig/p/9103144.html

请直接看四、解决对策,希望本文解决你的问题

现在网上大多讨论的是对SpringBoot使用由freemarker等模板引擎渲染出的html网页的静态访问的支持。但是对于一个前后端分离的项目,比如前端使用vue、React等写,后端使用Spring家族技术等,往往开发者选择将前端开发的网页通过webpack等直接打包成含组成网页的静态文件的文件夹 然后交到后端同学手中。比如在/dist下:

图1 前端打包的静态文件

二、问题产生

一般而言SpringBoot中默认开启支持浏览器直接访问这些静态文件的,只要你放在诸如src/main/resources/下的static等就可以使用浏览器访问。但是有可能像我一样无法访问,出现类似404的问题(There was an unexpected error (type=Not Found, status=404).):

图2 浏览器无法直接访问静态资源

三、问题原因猜想

【这里分析有误的,请指出,谢谢】浏览器输入http://localhost:8080/1.png (1.png在/src/main/resources/static/1.png),无法访问,查看Idea的控制台输出:

图3 Idea控制台输出

意思是找不到处理我的静态文件[1.png]的dispatcherServlet,进一步搜索,大概意思是静态资源无法映射,这让我很好奇:静态资源不是默认有映射的吗,为什么需要交给servlet来处理?难道需要把"1.png"和各个RestController中的接口方法的@RequestMapping的值比对吗?后来在Stack Overflow上发现是默认的映射出了问题。

前面提到过,SpringBoot默认会帮你配置对静态文件访问的映射,但是如果你通过某种直接或者其它间接的方式使用了@EnableWebMvc,意思是你想完全地进行web配置,那么Spring就会忽略默认的配置信息,去寻找相应的你的设置文件。如果你没有设置,就会出现上面这个问题了。

虽然我不知道我哪里使用了@EnableWebMvc,但是顺着这个思路,发现能够解决这个问题。这个通过结果猜想过程的方法不严谨,因此如果有理解错误,请大家指出,一是矫正我的错误,二是不想让看我文章的读者被我误导,谢谢。

四、解决对策

解决方法是配置WebMvcXXX(多说一句WebMvcConfigurerAdapter在Spring新版本已经过时,因此再看相应的解决方案请慎重)比如新建一个文件WebConfiguration.java,然后码上如下代码:

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
@Configuration
public class WebConfiguration extends WebMvcConfigurationSupport {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry){
        registry.addResourceHandler("/**")
                .addResourceLocations("classpath:/static/");//这里将/static文件夹定为资源目录,需要根据实际更换
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("forward:/index.html");

注意:15-18是将"/"映射到"/index.html"去,如果没有这个需求可以去掉。

如果没有解决你的问题,请不要放弃,继续在互联网上探索了。

五、引用及致谢

我只是知识的搬运工,这篇文章离不开他们:

[1] https://stackoverflow.com/questions/41691770/spring-boot-unabe-to-serve-static-image-from-resource-folder

[2] https://stackoverflow.com/questions/27381781/java-spring-boot-how-to-map-my-app-root-to-index-html

以及其它参考过的网页

分类: Spring Boot

resource: static-locations: classpath:/static/

“spring.mvc.static-path-pattern”用于阐述HTTP请求地址,
而“spring.resources.static-locations”则用于描述静态资源的存放位置。

特别是测试发现:

spring.resources.static-locations”用于告诉Spring Boot应该在何处查找静态资源文件,这是一个列表性的配置,查找文件时会依赖于配置的先后顺序依次进行,默认的官方配置如下:

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

竟然不支持classpath:/static/ 下级目录

Spring Boot(六):如何配置静态资源的地址与访问路径

2017年10月20日 20:21:18 蚁方阵 阅读数:29248 标签: spring-boot 静态资源 static html文件 js文件
个人分类: java
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yiifaa/article/details/78299052
静态资源,例如HTML文件、JS文件,设计到的Spring Boot配置有两项,一是“spring.mvc.static-path-pattern”,一是“spring.resources.static-locations”,很多人都难以分辨它们之间的差异,所以经常出现的结果就是404错误,无法找到静态资源。

  • spring.mvc.static-path-pattern
  • spring.mvc.static-path-pattern代表的含义是我们应该以什么样的路径来访问静态资源,换句话说,只有静态资源满足什么样的匹配条件,Spring Boot才会处理静态资源请求,以官方配置为例:

    #   这表示只有静态资源的访问路径为/resources/**时,才会处理请求
    spring.mvc.static-path-pattern=/resources/**,
    

    假定采用默认的配置端口,那么只有请求地址类似于 http://localhost:8080/resources/jquery.js 时,
    Spring Boot才会处理此请求,处理方式是将根据模式匹配后的文件名查找本地文件,那么应该在什么地方查找本地文件呢?
    这就是spring.resources.static-locations的作用了。

  • spring.resources.static-locations
  • spring.resources.static-locations用于告诉Spring Boot应该在何处查找静态资源文件,这是一个列表性的配置,查找文件时会依赖于配置的先后顺序依次进行,
    默认的官方配置如下:

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

    继续以上面的请求地址为例, http://localhost:8080/resources/jquery.js 就会在上述的四个路径中依次查找是否存在 jquery.js 文件,如果找到了,则返回此文件,否则返回404错误。

  • 静态资源的Bean配置
  • 从上面可以看出, spring.mvc.static-path-pattern 与 spring.resources.static-locations 组合起来演绎了nginx的映射配置,
    如果熟悉Spring MVC,那么理解起来更加简单,它们的作用可以用Bean配置表示,如下:

    @Configuration
    @EnableWebMvc
    public class WebConfig extends WebMvcConfigurerAdapter {
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/resources/**")
                    .addResourceLocations("/public-resources/")
                    .setCacheControl(CacheControl.maxAge(1, TimeUnit.HOURS).cachePublic());
    

    或者等同与以下的XML。

    <mvc:resources mapping="/resources/**" location="/public-resources/">
        <mvc:cache-control max-age="3600" cache-public="true"/>
    </mvc:resources>

    spring.mvc.static-path-pattern用于阐述HTTP请求地址,
    而spring.resources.static-locations则用于描述静态资源的存放位置。