springboot 静态资源无法访问以及添加静态资源无法立即访问

springboot 静态资源无法访问

在一个项目中WebMvcConfigurationSupport只能存在一个,多个的时候,只有一个会生效。(按名称排序后第一个的)

1.SpringBoot 的 @EnableAutoConfiguration 会启用自动配置类

2.WebMvcAutoConfiguration,该类配置了一些默认的静态资源映射

  • 自动映射 localhost:8080/** 为以下路径
    classpath:/resources/
    classpath:/static/
    classpath:/public/
    classpath:/META-INF/resources/
    2. 自动映射 localhost:8080/webjars/** 为以下路径
    classpath:/META-INF/resources/webjars/

此时,我们不需要多做什么,只要将静态资源放入 src/main/resources 目录下的 resources、static 或 public 文件夹下,即可通过 url 定位相关资源,例如 localhost:8080/index.html 可定位至 src/main/resources/static/index.html

但是!
一旦使用继承了WebMvcConfigurationSupport或者WebMvcConfigurerAdapter的自定义配置类,即使没有重写addResourceHandlers方法,默认配置都会被不被采用。如果要采用原本默认的配置,则需要webmvc配置类中重写如下方法:

@Configuration
public class GoWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //配置静态资源处理
        registry.addResourceHandler("/**")
                .addResourceLocations("resources/", "static/", "public/", 
                "META-INF/resources/")
                .addResourceLocations("classpath:resources/", "classpath:static/", 
                "classpath:public/", "classpath:META-INF/resources/")
                .addResourceLocations("file:///tmp/webapps/");
    }
}

经过试验得证:如果不使用WebMvcConfigurationSupport,则使用application.properties中的默认配置
如果重写了application.properties中的配置,则使用重写后的配置,如:

spring.resources.static-locations=resources/, static/, public/, \ META-INF/resources/, resources/, classpath:static/, public/, classpath:META-INF/resources/, \file:///tmp/webapps/

spring.mvc.static-path-pattern=/**

一旦使用了WebMvcConfigurationSupport(或WebMvcConfigurerAdapter)那么必须要重写addResourceHandlers来配置资源映射,此时application.properties中关于静态资源访问的配置将失效(除非对url写了响应的controller来处理,那是另一回事)

当添加了静态资源后,无法立即访问的问题

如果访问项目中的静态资源,访问的所有的东西其实都是target目录中的,这是经过编译的,如果对项目目录下的静态资源进行修改(增删改),由于target下的东西没有受影响,所以没法立即生效,比如往/resouces/static下增加一张图片,通过url无法立即访问到,必须重启项目。其实重启就是让资源文件经过编译(其实资源文件根本不编译)后,加到target中,那么这样就很麻烦,要是想对一个静态资源修改后能立即通过url访问到要如何做呢?
解决办法将静态资源放在非项目类路径下即可,例如 “file:///Users/mytest/inspector/independent_resources/“);,并且在资源处理器中加上路径即可。
file:// 后面跟的必须是文件系统的绝对路径

registry.addResourceHandler("/**”)
//**********/
        .addResourceLocations("resources/", "static/", "public/",
                "META-INF/resources/")
        .addResourceLocations("classpath:resources/", "classpath:static/",
                "classpath:public/", "classpath:META-INF/resources/")
//**********/
        //如果要让添加的静态资源立即生效,则不能把它放到项目资源里面,应该放在外面,比如下面的目录
        //这样一旦静态资源添加到这个目录,则直接从该位置获取,而不是从编译的target位置获取
        .addResourceLocations("file:///Users/mytest/inspector/independent_resources/");

/**********之间的是项目类的路径,不用管,最下面的是非项目类的路径
这样的话,在项目运行时,往/Users/mytest/inspector/independent_resources/目录下添加一个111.png后,在浏览器中通过localhost:8080/111.png就可访问到这个图片了。
如果不添加这个,在项目运行时,往项目的src/main/resources 下添加一个111.png后,不能立即通过浏览器访问到这个图片,因为项目类的所有资源和文件必须编译为target版本后才对外服务,而添加资源后不重启项目无法重新编译,target中的东西没有更新。

见https://blog.csdn.net/rui18300072030/article/details/74923580

因此,需要修改后立即生效的文件,尤其是非代码文件(除去html,css这种)最好是放在项目类的外部,放在文件系统的绝对路径下。如果文件必须放在项目中,但又必须得立即生效,
那么对项目中的同一个资源目录,即添加其相对路径,又添加其绝对路径:

如果文件必须放在项目中,但又必须得立即生效,那么用下面的方法:
对项目中的同一个资源目录,即添加其相对路径,又添加其绝对路径:

registry.addResourceHandler("/**")
        .addResourceLocations("classpath:static/")
 .addResourceLocations("file:///Users/mytest/inspector/src/main/resources/static/");

上面两个路径其实是同一个,但通过上面相对路径访问的是target中的东西。在运行时添加一个文件后,target没有更新,通过相对路径就访问不到,但实际上文件系统是更新了,所以用下面的绝对路径直接访问文件系统中的文件就可。

发布了21 篇原创文章 · 获赞 19 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43752854/article/details/103710413