iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >SpringMVC中的http Caching的具体使用
  • 567
分享到

SpringMVC中的http Caching的具体使用

2024-04-02 19:04:59 567人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录过期时间Last-ModifiedETagspring ETag filterCache 是Http协议中的一个非常重要的功能,使用Cache可以大大提高应用程序的性能,减少数据

Cache 是Http协议中的一个非常重要的功能,使用Cache可以大大提高应用程序的性能,减少数据的网络传输。

通常来说我们会对静态资源比如:图片,CSSjs文件等做缓存。同样的我们可以使用HTTP Cache配合Spring mvc来做动态资源的缓存。

那么什么时候使用动态资源的缓存呢?

只有当这个资源不经常更新或者你确切的知道该资源什么时候更新的时候就可以使用HTTP Cache了。

HTTP Cache是通过请求头来实现的,主要有三种方式:过期时间,最后更新时间和Etag。

其中过期时间是客户端验证,最后更新时间和Etag是服务器端验证。

过期时间

过期时间又有两种方式,分别是Cache-Control和Expires头。

在Cache-Control中,我们可以设置它的maxAge,超出该时间后,该资源才会被再次请求。如下所示:


@GetMapping("/{id}")
ResponseEntity<Product> getProduct(@PathVariable long id) {
   // …
   CacheControl cacheControl = CacheControl.maxAge(30, TimeUnit.MINUTES);
   return ResponseEntity.ok()
           .cacheControl(cacheControl)
           .body(product);
}

我们也可以在Head中设置Expires属性。Expires的时间需要是标准时间格式,如下:

Sun, 06 Nov 1994 08:49:37 GMT  ; RFC 822, updated by RFC 1123
Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036
Sun Nov  6 08:49:37 1994       ; ANSI C's asctime() fORMat

如果要在java中使用,参考如下的例子:


@GetMapping("/forecast")
ResponseEntity<Forecast> getTodaysForecast() {
   // ...
   ZonedDateTime expiresDate = ZonedDateTime.now().with(LocalTime.MAX);
   String expires = expiresDate.format(DateTimeFormatter.RFC_1123_DATE_TIME);
   return ResponseEntity.ok()
           .header(HttpHeaders.EXPIRES, expires)
           .body(weatherForecast);
}

如果Cache-Control和Expires同时出现,则会优先使用 Cache-Control。

Last-Modified

它的验证逻辑是这样的,客户端会根据上次请求得到的Last-Modified设置它的If-Modified-Since,服务器端接收到了这个属性之后可以跟之前的进行比较,如果相同则可以返回一个空的body。如下所示:


@GetMapping("/{id}")
ResponseEntity<Product> getProduct(@PathVariable long id, WEBRequest request) {
   Product product = repository.find(id);
   long modificationDate = product.getModificationDate()
           .toInstant().toEpochMilli();
 
   if (request.checkNotModified(modificationDate)) {
       return null;
   }
 
   return ResponseEntity.ok()
           .lastModified(modificationDate)
           .body(product);
}

ETag

Last-Modified的时间只能精确到秒,如果还需要更细粒度的话,就需要用到ETag了。

ETag可以看成当前时刻某个资源的唯一标记,你可以取该资源的hash值作为ETag。

下面是它的一种实现:


@GetMapping("/{id}")
ResponseEntity<Product> getProduct(@PathVariable long id, WebRequest request) {
   Product product = repository.find(id);
   String modificationDate = product.getModificationDate().toString();
   String eTag = DigestUtils.md5DigestAsHex(modificationDate.getBytes());
 
   if (request.checkNotModified(eTag)) {
       return null;
   }
 
   return ResponseEntity.ok()
           .eTag(eTag)
           .body(product);
}

Spring ETag filter

Spring提供了一个ShallowEtagHeaderFilter来根据返回的内容自动为你生成Etag。


@Bean
public FilterReGIStrationBean filterRegistrationBean () {
   ShallowEtagHeaderFilter eTagFilter = new ShallowEtagHeaderFilter();
   FilterRegistrationBean registration = new FilterRegistrationBean();
   registration.setFilter(eTagFilter);
   registration.addUrlPatterns("/*");
   return registration;
}

请注意, ETag计算可能会影响性能。

到此这篇关于springMVC中的http Caching的具体使用的文章就介绍到这了,更多相关SpringMVC http Caching内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: SpringMVC中的http Caching的具体使用

本文链接: https://www.lsjlt.com/news/134406.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SpringMVC中的http Caching的具体使用
    目录过期时间Last-ModifiedETagSpring ETag filterCache 是HTTP协议中的一个非常重要的功能,使用Cache可以大大提高应用程序的性能,减少数据...
    99+
    2024-04-02
  • SpringMVC整合Kaptcha的具体使用
    目录验证码的作用Kaptcha 简介Kaptcha 详细配置表Spring MVC 整合 KaptchaPOM创建 Spring 配置控制器关键代码JSP 关键代码验证码的作用 防止...
    99+
    2024-04-02
  • java中的DateTime的具体使用
    目录1.初始化时间2.按格式输出时间(将DateTime格式转换为字符串)3.将字符串转换为DateTime格式4.取得当前时间5.计算两个日期间隔的天数6.增加日期7.减少日期8....
    99+
    2024-04-02
  • React中useRef的具体使用
    相信有过React使用经验的人对ref都会熟悉,它可以用来获取组件实例对象或者是DOM对象。 而useRef这个hooks函数,除了传统的用法之外,它还可以“跨渲染周期”保存数据。 ...
    99+
    2024-04-02
  • python中pywifi的具体使用
    目录写在前面pywifi常量接口wifi连接代码写在前面 无线AP(Access Point):即无线接入点 python的wifi管理模块叫pywifi 安装 pip instal...
    99+
    2023-03-06
    python pywifi
  • Golang中Model的具体使用
    目录导语使用之前的准备开始使用发布版本引用自己封装的包修改版本导语 我们都知道在Golang中我们一般都是设置GOPATH目录,这个目录主要存放我们的第三方包,这个方式一直不是很方便...
    99+
    2023-05-14
    Golang Model使用 Golang Model
  • java中Thread.sleep()的具体使用
    目录sleep功能介绍:sleep Thread.sleep()被用来暂停当前线程的执行,会通知线程调度器把当前线程在指定的时间周期内置为wait状态。当wait时间结束,线程状态重...
    99+
    2023-05-17
    java Thread.sleep
  • numpy中nan_to_num的具体使用
    在Numpy中NaN值一般出现在数据清洗前,出现这个值说明这个数据是缺失的 在有些时候我们会选择直接删除这些数据,但有些时候这些数据是不能删除的,这个时候我们就需要使用一些方法将np...
    99+
    2024-04-02
  • pandas中df.rename()的具体使用
    df.rename()用于更改行列的标签,即行列的索引。可以传入一个字典或者一个函数。在数据预处理中,比较常用。 官方文档: DataFrame.rename(self, mappe...
    99+
    2024-04-02
  • django中websocket的具体使用
    websocket是一种持久化的协议,HTTP协议是一种无状态的协议,在特定场合我们需要使用长连接,做数据的实时更新,这种情况下我们就可以使用websocket做持久连接。http与...
    99+
    2024-04-02
  • Quartz.NET的具体使用
    目录一、什么是Quartz.NET?二、Quartz.NET可以做什么?三、ASP.NET Core如何使用Quartz.NET?四、Quartz的cron表达式一、什么是Quart...
    99+
    2024-04-02
  • JavaScheduledExecutorService的具体使用
    目录1. 延迟不循环任务schedule方法2. 延迟且循环cheduleAtFixedRate方法3. 严格按照一定时间间隔执行``ScheduledExecutorService...
    99+
    2023-05-19
    ScheduledExecutorService
  • QtQFrame的具体使用
    目录1.概述2.常用数据接口3.示例1.概述 void setFrameShape(Shape) QFrame继承QWidget,QFrame类是具有框架的小部件的基类,例如QLab...
    99+
    2024-04-02
  • python__add__()的具体使用
    __add__(),  同一个类,两个对象相加的实现逻辑,重写 + class Myclass(object): def __init__(self,value):...
    99+
    2023-02-27
    python __add__()使用 python __add__
  • C#中{get;set;}的具体使用
    在C#程序中经常会看到set,get的配套使用,很多人不知道它的用途。我就在这向大家讲讲,也加深一下自己的印象。 //这里有两个类 public class person1 { ...
    99+
    2023-02-06
    C# {get;set;} C# GET SET
  • Node中的streams流的具体使用
    目录Node中的streams流转换流创建对象模式最后Node中的streams流 streams流是Node中的最好的特性之一。它在我们的开发过程当中可以帮助我们做很多事情。比如通...
    99+
    2024-04-02
  • Vue中this.$nextTick()的具体使用
    目录1、官网说法2、DOM 更新3、获取更新后的 DOM4、小结:this.$nextTick()的使用场景1、官网说法 在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后...
    99+
    2023-02-06
    Vue this.$nextTick()
  • pythonhttpx的具体使用
    目录什么是 Httpx安装 Httpx发送 HTTP 请求发送异步 HTTP 请求设置请求标头设置请求参数发送请求体发送 JSON 数据设置超时错误处理证书验证使用代理上传文件使用 ...
    99+
    2023-05-14
    python httpx
  • np.unique()的具体使用
    目录一、np.unique() 介绍二、np.unique() 原型三、实例参考链接一、np.unique() 介绍 对于一维数组或者列表,np.unique() 函数 去除其中重复...
    99+
    2023-03-14
    np.unique()使用 np.unique()
  • idea中的project、module、artifact的具体使用
    目录一、Project【工程】二、Modules【模块,一个poject可包含多个】三、Libraries四、Facets【设置 Tomcat读取的web.xml配置文件 和 Web...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作