SpringBoot无法访问/static下静态资源的解决

 更新时间:2021年09月09日 14:35:47   作者:Apelx  
这篇文章主要介绍了SpringBoot无法访问/static下静态资源的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

SpringBoot无法访问/static下静态资源

SpringBoot 访问静态资源的规则

都在WebMvcAutoConfiguration自动配置类中

在这里插入图片描述

在该类下有对资源处理的方法

在这里插入图片描述 在这里插入图片描述

在这里插入图片描述

默认按照该加载顺序,加载静态资源文件,而我尝试了N次,浏览器无法访问资源;查看官网后,我又修改了默认的加载位置。如下:

在这里插入图片描述

spring.resources.static-locations=/static/

但是还是没有能如期访问! 而回过头再回过头看Web的自动配置类,我发现了一个被忽略的配置

在这里插入图片描述

WebMvcConfigurationSupport.class这个类没有的情况下,才会走SpringBoot的Web自动配置,而在==@EnableWebMvc==中,又惊奇的发现了它

在这里插入图片描述

在这里插入图片描述

SpringBoot容器里读到了我们配置的@EnableWebMvc 注解

它通过 @Import 导入了 WebMvcConfigurationSupport 类,从而导致了 WebMvcAutoConfiguration 类没有生效,此时我的问题找到了! 最后我又在Spring的官网找到了对应的解释,可供参考Spring MVC Auto Configuration

小结一下

如果项目有没有非常多的功能,可以使用 @EnableWebMvc 注解,全面接管SpringBoot对SpringMVC的自动注入,自己来写SpringMVC 运行所需的一些配置,这样会减少自动注入带来的一些无意义性能消耗;

而一般功能比较多的项目,还是使用SpringBoot推荐的对SpringMVC拓展方法 —— 继承 WebMvcConfigurer 类,这样不仅可以自己实现想要添加的WEB组件,也保留了SpringBoot底层的自动注入

SpringBoot2.*.*无法访问静态资源的坑

遇到的问题

在导入静态资源(css、js包等)和html页面模板时,发生无法读取静态资源的情况,总结是以下两种情况:

1、输入访问静态资源的url,出现白页错误,无法访问静态资源;

2、输入访问html页面的url,可以访问成功,但是html页面布局乱了,无法读取样式;

由于样式是放在静态资源文件夹的,既然无法访问静态资源,那么html页面自然就无法读取样式了。所以问题归结于“无法访问静态资源”。

注:模板引擎采用的是springboot推荐的thymeleaf来渲染html页面

解决的方法

在配置类中添加以下方法

增加静态资源的访问路径

主:详细参考以下个人写的配置类

@Configuration
public class SigninConfig extends WebMvcConfigurationSupport {
    //增加访问路径
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
    }
    //请求与页面映射
    @Override
    protected void addViewControllers(ViewControllerRegistry registry) {
        //urlPath:请求
        //setViewName:html页面
        registry.addViewController("/").setViewName("signin");
    }
}

粗略的原因

springboot关于springmvc自动配置的机制主要有以下两种(目前了解的),其中第一种就是涉及到“为什么无法访问静态资源”的问题:

(1)springboot不允许用户个人添加的组件与自动配置一起作用,那么用户添加的组件会覆盖掉自动配置。

我的配置类继承WebMvcConfigurationSupport,这是springmvc自动配置类,我猜想这个类涉及到静态资源路径的默认配置(没有详细看源码不确定),@Configuration又把我的配置类添加到容器中,相当于我的配置类和自动配置类都在容器中,那么根据(1),自动配置的静态资源路径自然就失效,所以如果我们不指定,自然就无法访问静态资源,所以需要我们重新指定静态资源路径(这也是为什么要重写addResourceHandlers方法)。

(2)springboot允许用户个人添加的组件(如view,也就是上述addViewControllers方法)与自动配置一起作用,那么用户添加的组件会和自动配置一起存在;

那么重点来了,以前springboot1.版本的时候还没有对(1)情况作出修改,也就是说即使你添加了相关的组件,默认的静态资源路径仍然是生效的,不需要再重写路径。

而到了springboot2.时,如果你添加了相关的组件,默认的静态资源路径就会失效,如果你不重新指明静态资源路径,那么你就无法访问静态资源,所以要多一步重新设置静态资源路径的步骤,完毕。

————————后续————————

原本是看着官网文档,打算按照官方说的做一遍,然后好奇就把原配置路径的代码删掉,结果居然能访问!!!没有报白页错误!!!

@Configuration
public class SigninConfig extends WebMvcConfigurationSupport {
//    @Override
//    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
//        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
//    }
    @Override
    protected void addViewControllers(ViewControllerRegistry registry) {
        //urlPath:请求
        //setViewName:html页面
        registry.addViewController("/").setViewName("signin");
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java8中的lambda表达式入门教程

    Java8中的lambda表达式入门教程

    lambda表达式,即带有参数的表达式,为了更清晰地理解lambda表达式,下面通过示例代码给大家介绍java8 lambda 表达式入门教程,感兴趣的朋友一起看看吧
    2017-08-08
  • 关于SpringBoot整合Canal数据同步的问题

    关于SpringBoot整合Canal数据同步的问题

    大家都知道canal是阿里巴巴旗下的一款开源工具,纯java开发,支持mysql数据库,本文给大家介绍SpringBoot整合Canal数据同步的问题,需要的朋友可以参考下
    2022-03-03
  • 解决Spring Batch框架job任务只跑一次的问题

    解决Spring Batch框架job任务只跑一次的问题

    这篇文章主要介绍了解决Spring Batch框架job任务只跑一次的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • java中BigDecimal类型比较大小和绝对值计算方式

    java中BigDecimal类型比较大小和绝对值计算方式

    这篇文章主要介绍了java中BigDecimal类型比较大小和绝对值计算方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • java实现随机验证码图片生成

    java实现随机验证码图片生成

    这篇文章主要为大家详细介绍了java实现随机验证码图片生成,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Java实现加盐加密算法的示例详解

    Java实现加盐加密算法的示例详解

    这篇文章主要为大家详细介绍了如何利用Java语言实现加盐加密算法,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下
    2023-06-06
  • Spring中利用SchedulingConfigurer实现动态定时任务配置的示例

    Spring中利用SchedulingConfigurer实现动态定时任务配置的示例

    定时任务是一项至关重要的功能,它们使得我们能够按照预定的时间执行特定的任务,本文主要介绍了Spring中利用SchedulingConfigurer实现动态定时任务配置的示例,感兴趣的可以了解一下
    2024-05-05
  • java文件删除不了的坑,特别是压缩文件问题

    java文件删除不了的坑,特别是压缩文件问题

    这篇文章主要介绍了java文件删除不了的坑,特别是压缩文件问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • Java实现通过时间获取8位验证码

    Java实现通过时间获取8位验证码

    这篇文章主要为大家详细介绍了Java如何通过时间获取8位验证码(每两个小时生成一个),文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-11-11
  • win10安装rabbitMQ的详细步骤

    win10安装rabbitMQ的详细步骤

    RabbitMQ是一个开源的消息中间件(Message Broker),它基于AMQP协议设计,用于在分布式系统中实现消息的高效、可靠传输,本文给打击介绍了win10安装rabbitMQ的详细步骤,文中通过图文讲解的非常详细,需要的朋友可以参考下
    2024-06-06

最新评论