# HTTP 缓存机制 技术 *Spring 技术栈* 此文章演示了在 TomCat SpringMVC 以及 SpringBoot 中 配置 Http缓存 技术 ## 目录 [TOC] ### Spring MVC Http缓存机制 #### 静态资源缓存 - 在Spring MVC 的 配置类中配置资源处理器 我们只需要在配置类中重写 `addResourceHandlers` 函数,并在函数中将资源缓存处理器添加进去即可,下面是一个示例代码! 在Spring MVC框架中,`WebMvcConfigurer`接口或其实现类(如`WebMvcConfigurerAdapter`,在较早版本的Spring中)中的`addResourceHandlers`方法用于配置静态资源的处理规则。给定的代码片段是该方法的一种实现,用于设置静态资源的访问路径映射、实际物理位置以及缓存控制策略。 ```java @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()); } ``` `registry.addResourceHandler("/resources/**"):` 这一行定义了对所有以 /resources/ 开头的HTTP请求进行特殊处理。这意味着当应用接收到任何针对 /resources/ 下级路径的请求时,它会尝试从预先配置好的静态资源目录中查找资源并返回给客户端。 `.addResourceLocations("/public-resources/"): `这个配置指定了静态资源的实际存储路径。当Spring MVC遇到上述匹配的URL请求时,它会在服务器的上下文根路径下查找名为 `/public-resources/` 的目录。例如,如果请求的是 `/resources/css/style.css`,那么Spring MVC将从应用的类路径或文件系统的 `/public-resources/css/style.css` 位置加载该文件。 `.setCacheControl(CacheControl.maxAge(1, TimeUnit.HOURS).cachePublic()):` 这部分设置了响应的缓存控制头信息,允许浏览器和其他HTTP客户端缓存这些静态资源。具体来说,设置了最大缓存时长为1小时(60分钟)。这意味着浏览器在首次获取资源后的一小时内再次请求同一资源时,可以使用本地缓存的副本,而不是重新向服务器请求。.cachePublic() 指示资源可以被任何缓存中间节点(不仅仅是用户的浏览器)缓存,并且可以被传递给其他用户。这对于减少网络带宽消耗和提高页面加载速度非常有用。 ### SpringBoot Http 缓存机制 #### 配置 http 缓存机制 在 SpringMVC 自动配置模块中,有这样的一个 `org.springframework.boot.autoconfigure.web.WebProperties` 类记载的就是 MVC 的配置信息,在这个类中包含一个 Resources 类的对象,这个对象中存储的就是配置的具体数值了。  而HTTP 缓存机制的配置项目也在这里,可以看到是多个类相互嵌套的关系,所以我们可以开始配置了。  ##### 实现 在上面我们了解了最基本的一些结构 现在需要开始上手来进行配置,下面就是配置文件。 ```yaml # 开始配置 HTTP 缓存机制 spring.mvc: resources: cache: # 设置缓存时间 这里是以秒为单位 代表的 1 小时 period: 3600 # cachecontrol 具有更多的配置,其中也包括 period 但是叫做 max-age 并且 通过 cachecontrol 配置的优先级更高 # 也就是说 在这里配置最后会直接覆盖掉 cache.period # 一般来说 需要更详细的配置就需要在这里操作 cachecontrol: # 设置缓存的过期时间 这是告诉浏览器此资源缓存 7200 秒 max-age: 3600 # 配置资源的对比策略,这里是使用的最后一次修改的时间 # 这个配置项在 spring 5.2.0 之后才支持 # 如果不配置此选项 默认的策略是 Last-Modified # Last-Modified 的策略是根据资源的最后修改时间来判断资源是否被修改过 # 如果资源被修改过 则会返回 304 状态码 # 如果资源没有被修改过 则会返回 200 状态码 # 但是 Last-Modified 的策略存在一个问题,就是如果资源的最后修改时间被修改过,那么资源的最后修改时间也会被修改,这样就会导致资源的最后修改时间永远是当前时间。 # 这个配置项默认是 true use-last-modified: true ``` #### 访问测试 在项目中的资源文件目录中有一个文件叫做 8.jpg 接下来我们将会通过浏览器访问两次这个图片,然后查看浏览器和服务器的通讯请求记录。  ##### 启动项目   ##### 第一次访问  ##### 第二次访问 第二次访问的响应码是304代表这个资源根本没有从服务器, 304编码代表转发的意思它是直接访问的磁盘。  ### TomCat 配置缓存机制 在 TomCat 服务器中是具备缓存处理器的,我们只需要在需要被进行缓存的项目的 web.xml 文件中的 `web-app` 标签内部加入下面的配置即可实现缓存的配置。 ```xml <!-- 定义ExpiresFilter过滤器,该过滤器用于设置HTTP响应头中的Expires和Cache-Control属性,以实现静态资源的缓存控制 --> <filter> <filter-name>ExpiresFilter</filter-name> <!-- 指定过滤器类为Apache Tomcat提供的ExpiresFilter类 --> <filter-class>org.apache.catalina.filters.ExpiresFilter</filter-class> <!-- 初始化参数配置 --> <!-- 对于图片资源(image类型),设置缓存过期时间为访问后10天 --> <init-param> <param-name>ExpiresByType image</param-name> <param-value>access plus 10 days</param-value> </init-param> <!-- 对于CSS样式表资源(text/css类型),设置缓存过期时间为访问后10天 --> <init-param> <param-name>ExpiresByType text/css</param-name> <param-value>access plus 10 days</param-value> </init-param> <!-- 对于JavaScript脚本资源(application/javascript类型),设置缓存过期时间为访问后10天 --> <init-param> <param-name>ExpiresByType application/javascript</param-name> <param-value>access plus 10 days</param-value> </init-param> </filter> <!-- 将ExpiresFilter过滤器映射到所有URL路径上 --> <filter-mapping> <filter-name>ExpiresFilter</filter-name> <url-pattern>/*</url-pattern> <!-- 确保过滤器在处理HTTP请求时生效 --> <dispatcher>REQUEST</dispatcher> </filter-mapping> ``` 当然,如果您希望过滤器作用在多个 url 中,您也可以直接想下面这样写多个 `filter-mapping` 标签实现这一需求 ```xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="4.0" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"> <filter> <filter-name>ExpiresFilter</filter-name> <!-- 指定过滤器类为Apache Tomcat提供的ExpiresFilter类 --> <filter-class>org.apache.catalina.filters.ExpiresFilter</filter-class> <!-- 初始化参数配置 --> <!-- 对于图片资源(image类型),设置缓存过期时间为访问后10天 --> <init-param> <param-name>ExpiresByType image</param-name> <param-value>access plus 10 days</param-value> </init-param> <!-- 对于CSS样式表资源(text/css类型),设置缓存过期时间为访问后10天 --> <init-param> <param-name>ExpiresByType text/css</param-name> <param-value>access plus 10 days</param-value> </init-param> <!-- 对于JavaScript脚本资源(application/javascript类型),设置缓存过期时间为访问后10天 --> <init-param> <param-name>ExpiresByType application/javascript</param-name> <param-value>access plus 10 days</param-value> </init-param> <!-- 对于json脚本资源(application/javascript类型),设置缓存过期时间为访问后12小时 --> <init-param> <param-name>ExpiresByType application/json</param-name> <param-value>access plus 12 hours</param-value> </init-param> </filter> <!-- 将ExpiresFilter过滤器映射到 文章 URL路径上 --> <filter-mapping> <filter-name>ExpiresFilter</filter-name> <url-pattern>/LS-WebBackEnd/articleController/*</url-pattern> <!-- 确保过滤器在处理HTTP请求时生效 --> <dispatcher>REQUEST</dispatcher> </filter-mapping> <!-- 将ExpiresFilter过滤器映射到 动态 URL路径上 --> <filter-mapping> <filter-name>ExpiresFilter</filter-name> <url-pattern>/LS-WebBackEnd/trends/*</url-pattern> <!-- 确保过滤器在处理HTTP请求时生效 --> <dispatcher>REQUEST</dispatcher> </filter-mapping> </web-app> ``` 下面就是配置好之后的访问测试效果,在访问页面的时候使用 F12 捕获了一下请求跟踪信息,可以看到这里的数据没有发送请求,而是直接从磁盘或者内存获取到的数据!!!  ------ ***操作记录*** 作者:[SpringBoot 助手](https://www.lingyuzhao.top//index.html?search=24 "SpringBoot 助手") 操作时间:2024-02-25 18:43:16 星期日 事件描述备注:保存/发布 中国 天津 [](如果不需要此记录可以手动删除,每次保存都会自动的追加记录)