`

Spring Boot 静态资源处理

    博客分类:
  • SSH
 
阅读更多

转:http://blog.csdn.net/isea533/article/details/50412212

 

Spring Boot 静态资源处理

Spring Boot 默认的处理方式就已经足够了,默认情况下Spring Boot 使用WebMvcAutoConfiguration中配置的各种属性。

建议使用Spring Boot 默认处理方式,需要自己配置的地方可以通过配置文件修改。

但是如果你想完全控制Spring MVC,你可以在@Configuration注解的配置类上增加@EnableWebMvc,增加该注解以后WebMvcAutoConfiguration中配置就不会生效,你需要自己来配置需要的每一项。这种情况下的配置方法建议参考WebMvcAutoConfiguration类。

本文以下内容针对Spring Boot 默认的处理方式,部分配置通过在application.yml配置文件中设置。

配置资源映射

Spring Boot 默认配置的/**映射到/static(或/public/resources/META-INF/resources),/webjars/**会映射到classpath:/META-INF/resources/webjars/

注意:上面的/static等目录都是在classpath:下面。

如果你想增加如/mystatic/**映射到classpath:/mystatic/,你可以让你的配置类继承WebMvcConfigurerAdapter,然后重写如下方法:

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/mystatic/**")
            .addResourceLocations("classpath:/mystatic/");
}

这种方式会在默认的基础上增加/mystatic/**映射到classpath:/mystatic/,不会影响默认的方式,可以同时使用。

静态资源映射还有一个配置选项,为了简单这里用.properties方式书写:

spring.mvc.static-path-pattern=/** # Path pattern used for static resources.

这个配置会影响默认的/**,例如修改为/static/**后,只能映射如/static/js/sample.js这样的请求(修改前是/js/sample.js)。这个配置只能写一个值,不像大多数可以配置多个用逗号隔开的。

使用注意

例如有如下目录结构:

└─resources
    │  application.yml
    │
    ├─static
    │  ├─css
    │  │      index.css
    │  │
    │  └─js
    │          index.js
    │
    └─templates
            index.ftl

index.ftl中该如何引用上面的静态资源呢?
如下写法:

<link rel="stylesheet" type="text/css" href="/css/index.css">
<script type="text/javascript" src="/js/index.js"></script>

注意:默认配置的/**映射到/static(或/public/resources/META-INF/resources

当请求/css/index.css的时候,Spring MVC 会在/static/目录下面找到。

如果配置为/static/css/index.css,那么上面配置的几个目录下面都没有/static目录,因此会找不到资源文件!

所以写静态资源位置的时候,不要带上映射的目录名(如/static//public//resources//META-INF/resources/)!

使用WebJars

WebJars:http://www.webjars.org/

例如使用jquery,添加依赖:

<dependency>
    <groupId>org.webjars</groupId>
    <artifactId>jquery</artifactId>
    <version>1.11.3</version>
</dependency>

然后可以如下使用:

<script type="text/javascript" src="/webjars/jquery/1.11.3/jquery.js"></script>

你可能注意到href中的1.11.3版本号了,如果仅仅这么使用,那么当我们切换版本号的时候还要手动修改href,怪麻烦的,我们可以用如下方式解决。

先在pom.xml中添加依赖:

<dependency>
    <groupId>org.webjars</groupId>
    <artifactId>webjars-locator</artifactId>
</dependency>

增加一个WebJarController

@Controller
public class WebJarController {
    private final WebJarAssetLocator assetLocator = new WebJarAssetLocator();

    @ResponseBody
    @RequestMapping("/webjarslocator/{webjar}/**")
    public ResponseEntity locateWebjarAsset(@PathVariable String webjar, HttpServletRequest request) {
        try {
            String mvcPrefix = "/webjarslocator/" + webjar + "/";
            String mvcPath = (String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);
            String fullPath = assetLocator.getFullPath(webjar, mvcPath.substring(mvcPrefix.length()));
            return new ResponseEntity(new ClassPathResource(fullPath), HttpStatus.OK);
        } catch (Exception e) {
            return new ResponseEntity<>(HttpStatus.NOT_FOUND);
        }
    }
}

然后使用的时候按照如下方式:

<script type="text/javascript" src="/webjarslocator/jquery/jquery.js"></script>

注意:这里不需要在写版本号了,但是注意写url的时候,只是在原来url基础上去掉了版本号,其他的都不能少!

静态资源版本管理

Spring MVC 提供了静态资源版本映射的功能。

用途:当我们资源内容发生变化时,由于浏览器缓存,用户本地的静态资源还是旧的资源,为了防止这种情况导致的问题,我们可能会手动在请求url的时候加个版本号或者其他方式。

版本号如:

<script type="text/javascript" src="/js/sample.js?v=1.0.1"></script>

Spring MVC 提供的功能可以很容易的帮助我们解决类似问题。

Spring MVC 有两种解决方式。

注意:下面的配置方式针对freemarker模板方式,其他的配置方式可以参考。

资源名-md5 方式

例如:

<link rel="stylesheet" type="text/css" href="/css/index-2b371326aa93ce4b611853a309b69b29.css">

Spring 会自动读取资源md5,然后添加到index.css的名字后面,因此当资源内容发生变化的时候,文件名发生变化,就会更新本地资源。

配置方式:

application.properties中做如下配置:

spring.resources.chain.strategy.content.enabled=true
spring.resources.chain.strategy.content.paths=/**

这样配置后,所有/**请求的静态资源都会被处理为上面例子的样子。

到这儿还没完,我们在写资源url的时候还要特殊处理。

首先增加如下配置:

@ControllerAdvice
public class ControllerConfig {

    @Autowired
    ResourceUrlProvider resourceUrlProvider;

    @ModelAttribute("urls")
    public ResourceUrlProvider urls() {
        return this.resourceUrlProvider;
    }

}

然后在页面写的时候用下面的写法:

<link rel="stylesheet" type="text/css" href="${urls.getForLookupPath('/css/index.css')}">

使用urls.getForLookupPath('/css/index.css')来得到处理后的资源名。

版本号 方式

application.properties中做如下配置:

spring.resources.chain.strategy.fixed.enabled=true
spring.resources.chain.strategy.fixed.paths=/js/**,/v1.0.0/**
spring.resources.chain.strategy.fixed.version=v1.0.0

这里配置需要特别注意,将version的值配置在paths中。原因我们在讲Spring MVC 处理逻辑的时候说。

在页面写的时候,写法如下:

<script type="text/javascript" src="${urls.getForLookupPath('/js/index.js')}"></script>

注意,这里仍然使用了urls.getForLookupPathurls配置方式见上一种方式。

在请求的实际页面中,会显示为:

<script type="text/javascript" src="/v1.0.0/js/index.js"></script>

可以看到这里的地址是/v1.0.0/js/index.js

静态资源版本管理 处理过程

在Freemarker模板首先会调用urls.getForLookupPath方法,返回一个/v1.0.0/js/index.js/css/index-2b371326aa93ce4b611853a309b69b29.css

这时页面上的内容就是处理后的资源地址。

这之后浏览器发起请求。

这里分开说。

第一种md5方式

请求/css/index-2b371326aa93ce4b611853a309b69b29.css,我们md5配置的paths=/**,所以Spring MVC 会尝试url中是否包含-,如果包含会去掉后面这部分,然后去映射的目录(如/static/)查找/css/index.css文件,如果能找到就返回。

第二种版本方式

请求/v1.0.0/js/index.js

如果我们paths中没有配置/v1.0.0,那么上面这个请求地址就不会按版本方式来处理,因此会找不到上面的资源。

如果配置了/v1.0.0,Spring 就会将/v1.0.0去掉再去找/js/index.js,最终会在/static/下面找到。

本文参考

  1. http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-web-applications.html
  2. http://www.webjars.org/documentation
  3. http://www.mscharhag.com/spring/resource-versioning-with-spring-mvc
  4. https://spring.io/blog/2014/07/24/spring-framework-4-1-handling-static-web-resources

如果你使用的JSP或者其他模板,你可以参考上面几个链接的内容。

最后

以上是Spring Boot 静态资源处理的内容,有些不全面的地方或者读者有更多疑问,可以查看Spring Boot完整文档或本文参考的内容。

关于Spring Boot更多的内容可以继续关注本博客。

Spring Boot 系列

由于我博客Spring Boot 系列文章还不够多,所以暂时不打算创建专栏,如果再多几篇我就建专栏。

  1. Spring Boot 入门

  2. Spring Boot 属性配置和使用

  3. Spring Boot 集成MyBatis

  4. Spring Boot 静态资源处理

分享到:
评论

相关推荐

    spring boot 静态资源处理方法

    在使用 WebJars 时,开发者可以利用 WebJarAssetLocator 来处理资源版本控制问题。可以在 `pom.xml` 文件中引入依赖项,例如: ```xml &lt;groupId&gt;org.webjars &lt;artifactId&gt;webjars-locator ``` 然后,定义一个 ...

    spring boot静态资源static文件

    spring boot静态资源static文件

    Spring Boot 静态资源处理方式

    这篇文章将详细介绍Spring Boot的静态资源处理方式。 首先,Spring Boot 默认情况下会自动配置静态资源的处理。它会在类路径(classpath)下的多个预定义目录中查找静态资源。这些目录包括 `/static`、`/public`、`...

    spring boot静态资源部署

    spring boot静态资源部署Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。

    Spring MVC和springboot静态资源处理.rar

    在Java Web开发中,Spring MVC和Spring Boot是两个非常重要的框架,它们都提供了对静态资源的处理机制。静态资源通常包括HTML、CSS、JavaScript、图片等文件,是构成Web应用程序用户体验的重要部分。本篇文章将详细...

    spring boot基础笔记

    10. Spring Boot静态资源处理:在Spring Boot中,可以通过类路径(classpath)下的目录(如static、public或resources)来放置静态资源。Spring Boot有一个默认的静态资源路径规则,其中resources目录下的静态资源...

    狂神spring-security静态资源.zip

    下面我们将深入探讨Spring Security的核心概念、功能以及它如何处理静态资源的保护。 1. **Spring Security简介** Spring Security 是Spring生态系统中的一个组件,用于提供认证(Authentication)和授权...

    狂神Spring Security静态资源

    总的来说,"狂神Spring Security静态资源"的资料应该涵盖了如何在Spring Boot中配置Spring Security来保护和管理静态资源的知识。这包括理解Spring Security的工作原理,以及如何通过配置文件或代码来定制安全策略,...

    Spring boot 默认静态资源路径与手动配置访问路径的方法

    Spring Boot 静态资源路径与手动配置访问路径的方法 Spring Boot 框架中,默认静态资源路径的配置是非常重要的,它直接影响着静态资源的访问路径。在本文中,我们将详细介绍 Spring Boot 默认静态资源路径与手动...

    SpringSecurity静态资源.rar

    6. **使用Spring Boot**:在Spring Boot应用中,Spring Security与Spring Boot的静态资源处理机制集成良好。通过`spring.security.filter.static-resources-locations`属性,可以指定静态资源的位置,并自动处理权限...

    2023最新《Spring Boot基础教程》

    全网内容最全,比收费教程更好的Spring Boot免费教程! 快速入门 Spring Boot 2.x基础教程:版本关系 Spring Boot 2.x基础教程:...Spring Boot 2.x基础教程:Swagger静态文档的生成 Spring Boot 2.x基础教程:找回启动

    Spring boot web 访问

    总结来说,"Spring Boot web 访问"涵盖了创建一个基础的Spring Boot Web应用,配置访问静态资源,使用Spring Boot DevTools进行快速开发,以及处理中文乱码问题。这些都是Spring Boot入门开发者需要掌握的基本技能,...

    spring-security静态资源

    在讨论“spring-security静态资源”这个主题时,我们将深入探讨Spring Security如何处理Web应用中的静态资源,如JavaScript、CSS、图片等。 1. **静态资源的安全访问** Spring Security 提供了一种机制来保护静态...

    SpringBoot项目+SpringSecurity+前端静态资源

    在Spring Boot中,可以通过Spring Boot的静态资源处理来服务于这些文件。默认情况下,Spring Boot会在`src/main/resources/static`目录下查找静态资源,并将其映射到应用的根URL路径下。 Spring Security对于前端...

    最新Spring Boot Admin 官方参考指南-中文版-2.x

    Spring Boot Admin 是一个社区驱动的项目,用于监控和管理基于Spring Boot的应用程序。它通过HTTP接口或者Spring Cloud的服务注册中心(如Eureka、Consul)来注册和发现应用。Spring Boot Admin的用户界面是一个建立...

    13. 处理静态资源(自定义资源映射)【从零开始学Spring Boot】

    在Spring Boot应用中,处理静态资源是开发Web应用时常见的任务。静态资源通常包括HTML、CSS、JavaScript等文件,它们不需服务器动态处理,而是直接发送给客户端。本篇文章将探讨如何自定义资源映射来更好地管理和...

    springboot security 静态资源

    另外,Spring Boot也提供了预定义的过滤器链`spring.security.filter.order`来处理静态资源,如果不需要自定义配置,可以通过配置属性来开启: ```properties spring.security.filter.order=-1 ``` 这会将Spring ...

    狂神说Java的spring boot课程静态资源

    哔哩哔哩app中up主狂神说Java的spring boot课程,资源是在spring boot课程进行讲解的静态资源源代码,没有修改的员工管理系统静态网页

    spring boot的demo.zip

    总的来说,"spring boot的demo.zip" 提供了一个全面的示例,涵盖了 Spring Boot 的基本应用、MyBatis 数据库操作、分页查询、模糊匹配以及外部静态资源访问,这些都是现代 Web 开发中的重要技术。通过深入研究这个...

Global site tag (gtag.js) - Google Analytics