在http中 Last-Modified 与 If-Modified-Since 都是用于记录页面最后修改时间的 HTTP 头信息,
注意,在这 Last-Modified 是由服务器往客户端发送的 HTTP 头,
另一个 If-Modified-Since是由客户端往服务器发送的头,
那么它们的到底是怎么玩的呢。。。。。用我项目中的一个实例来说明把!
(基金项目) 由于基金净值每天才更新一次,所以在项目启动的时候到数据库中拿一次数据,然后缓存这个list,同时也把缓存这个list的date保存起来,然后在通过定时器,定时在某个时间点去更新这个list,更新缓存date。
由于list每天才更新一次,那么前端页面输出这个list的数据也要一天才会变化一次,为了减缓服务器的压力,页面也能缓存起来。
个人理解原理:
可以看到,再次请求本地存在的 cache 页面时,客户端会通过 If-Modified-Since 头将先前服务器端发过来的
Last-Modified 最后修改时间戳发送回去,这是为了让服务器端进行验证,通过这个时间戳判断客户端的页面
是否是最新的,如果不是最新的,则返回新的内容,如果是最新的,则 返回 304 告诉客户端其本地 cache 的页面
是最新的,于是客户端就可以直接从本地加载页面了,这样在网络上传输的数据就会大大减少,同时也减轻了服务器的负担。
在看看源码:
/**
*
* @param lastModifiedTimestamp 缓存list的时间戳
* @return 是否大于缓存list的时间戳
*/
public boolean checkNotModified(long lastModifiedTimestamp) {
if (lastModifiedTimestamp >= 0 && !this.notModified &&
(this.response == null || !this.response.containsHeader(HEADER_LAST_MODIFIED))) {
long ifModifiedSince = getRequest().getDateHeader(HEADER_IF_MODIFIED_SINCE);//取得客户端传上来的时间戳 if-modified
this.notModified = (ifModifiedSince >= (lastModifiedTimestamp / 1000 * 1000));
if (this.response != null) {
if (this.notModified) {//大于
this.response.setStatus(HttpServletResponse.SC_NOT_MODIFIED); //往响应流中状态设为305
}
else {
this.response.setDateHeader(HEADER_LAST_MODIFIED, lastModifiedTimestamp); //把最新的缓存时间戳赋给响应流中的 Last-Modified
}
}
}
return this.notModified;
}
上面这个类在 org.springframework.web.context.request.ServletWebRequest
然后在controller中调用:
@RequestMapping(method = { RequestMethod.GET, RequestMethod.POST })
public HashMap getFundNavInfoList(WebRequest webRequest,HttpServletRequest request,FundNavInput in) throws Exception {
//check is modify true代表客户端是最新的,直接返回,客户端根据响应流中304取本地缓存
if(webRequest.checkNotModified(lastModifyTime)){
return null;
}
//.........后面是代码不重要。。。。
}
总结:
这种方式适合数据更新频率慢,如果是实时数据,这种方式就不行了。。。。。。
欢迎大伙指出不足地方!。。。
- 大小: 148 KB
分享到:
相关推荐
总结来说,less-modify-var-loader是前端开发中一个实用的Webpack加载器,专门用于在构建过程中动态替换Less预处理器中的变量,使得主题定制和环境适配变得更加便捷。通过合理利用这个工具,开发者可以更高效地管理...
需要注意的是,过度依赖缓存或者完全禁用缓存都可能导致性能问题,因此在处理Ajax缓存时,应当权衡用户体验和数据实时性之间的平衡。同时,对于动态更新的数据,服务端也应该提供恰当的版本控制或者ETag机制,确保...
综上所述,这个"modify-GA-code.zip_Modified"压缩包包含了一个经过修改的遗传算法的实现,涉及到了遗传算法的基本流程和核心操作的改进,如交叉、变异和选择策略。通过分析和理解这些文件,我们可以学习如何根据...
"modify-http-headers"是一款针对Google Chrome浏览器的插件,主要功能是允许用户自定义和修改HTTP请求头,以满足特定的测试、调试或者隐私需求。这款插件在2019年8月20日的版本被提及,可能是该版本的一个更新或...
2.4.11-packet-tracer---modify-single-area-ospfv2_zh-CN.pka
在"dingshiqi-modify"这个项目中,很可能就是利用了System.Timers.Timer类来实现的。Timer类提供了一个Elapsed事件,当指定的时间间隔过去后,这个事件就会被触发。开发者可以通过添加事件处理程序到Elapsed事件上来...
总结,"Network-Reinstall-System-Modify-Stable_Version-3.1.1.zip" 提供的是一套全面的云服务器系统重装和优化方案。它简化了运维流程,提升了服务器性能,确保了系统的稳定性和安全性,是云服务器管理者的得力...
在这个场景中,"0001-modify-lockScreen-style.zip"是一个专门针对锁屏界面进行修改的项目,它包含了两个关键文件:0001-modify-lockScreen-style.patch和0001-modify-lockScreen-style补充.patch。这两个补丁文件是...
这个压缩包文件包含了一个名为"Filename-modify.exe"的可执行程序,用于帮助用户高效地整理和规范他们的文件命名。 文件名的统一性和规范性对于提高工作效率、便于文件检索以及数据管理具有重要意义。在实际工作中...
Knowlton -- Python. Create-Modify-Reuse -- 2008 -- code.7z
开机启动脚本patch......................................................................................
在Linux系统中,对文件进行实时监测和管理是一项常见的任务,尤其在开发和运维场景下。标题"read-file--modify.zip_Linux 文件监测"暗示我们要讨论的是如何在Linux环境下监测文件的变化,并在检测到文件被修改时执行...
gulp-modify-css-urls Gulp插件,用于修改CSS URL安装npm install --save-dev gulp-modify-css-urls 用法ES2015 /* gulpfile.babel.js */import gulp from 'gulp' ;import modifyCssUrls from 'gulp-modify-css-urls...
标题中的“iapws97-modify.rar”是一个压缩文件,其中包含了有关IF97(International Formulation 1997 for the Thermodynamic Properties of Water and Steam)标准的C#编程代码。IF97是国际上广泛使用的水和蒸汽...
此框架的自定义版本 "struts-1.2.9-modify-by-selfimpr.jar" 可能是一位开发者根据自己的需求对原版Struts 1.2.9进行了一些修改或增强,以适应特定项目或功能需求。由于描述中提到的“NULL”和没有具体的修改内容,...
Hosts-Modify.bat
总的来说,`se-modify.sh`和`se-modify-2.sh`脚本提供了一种方便的方式来管理和调整SELinux的`sebool`值,但使用它们时需要谨慎,确保符合安全策略,并遵循适当的流程。通过阅读和理解`说明.txt`文件,我们可以更好...
"auto-modify-the-file-names.zip_names" 提供的工具或脚本显然就是针对这一需求的解决方案。这个压缩包可能包含一个或多个VB(Visual Basic)脚本,用于在当前目录下批量替换文件的名称,以实现快速、高效地管理...
简单的修改头 该扩展基于规则表重写标头。 可能:添加,修改或删除HTTP(S)请求或响应的标头字段以文件(json格式)导出配置从文件中导入配置... webRequest,webRequestBlocking, ... 支持语言:English (United States)
总的来说,"liquibase-modify-column-3.1.zip" 和 "liquibase-hibernate.zip" 提供了一个强大的工具链,使得在 Java 开源项目中,特别是在使用 Hibernate 的情况下,管理数据库变更变得高效且可靠。通过深入理解这两...