当前位置: 首页 > news >正文

JSP 项目静态资源后拼接版本号/时间戳,免刷新

因为最近在做之前的项目,缺少这部分内容,导致改了js或者css文件后,去浏览器不能实时看到效果;

拼接时间戳

因为在本地环境,需要频繁改代码,去刷新,所以解决方案是拼接时间戳。
因为自己在做的项目中,每个jsp 文件都引入了一个公共的jsp,所以以下代码就贴在了公共的jsp里,涉及到每个页面在局部去在对应的静态资源后拼接;

<% // 禁用缓存 response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate, max-age=0"); response.setHeader("Pragma", "no-cache"); response.setDateHeader("Expires", 0); response.setDateHeader("Last-Modified", System.currentTimeMillis()); // 强制更新最后修改时间 // 开发环境测试:时间戳作为版本号(每次刷新都生成新值,强制刷新所有静态资源) long timestamp = System.currentTimeMillis(); request.setAttribute("staticVersion", timestamp); %>

分两个层面解读:

① HTTP 响应头 —— 禁止浏览器缓存 JSP 页面本身

响应头 作用

Cache-Control: no-cache... 告知浏览器和代理:此页面不可缓存

Pragma: no-cache 兼容 HTTP/1.0 的老浏览器

Expires: 0 设置过期时间为过去,立即失效

Last-Modified: 当前时间 每次都是"最新",强制重新请求

② staticVersion 时间戳 —— 控制静态资源缓存

long timestamp = System.currentTimeMillis(); // 如:1717912345678
request.setAttribute("staticVersion", timestamp);

该值存入 request 域,供后续 EL 表达式 ${staticVersion} 取用,拼接到所有静态资源 URL 后面:

<script src=".../jquery-1.8.3.js?v=1717912345678"></script>
<link href=".../style.css?v=1717912345678" ...>

浏览器以完整 URL(含参数) 作为缓存 key。每次刷新页面,System.currentTimeMillis() 都会生成新的毫秒时间戳,URL 就变了,浏览器认为是新资源,强制重新下载。

拼接版本号

每次刷新所有 JS/CSS 都重新下载,对生产环境性能影响较大,建议生产改为固定版本号;

<% // 静态资源版本号 —— 发版时只需修改此处一个值! final String staticVersion = "1.0.0"; request.setAttribute("staticVersion", staticVersion); // 禁用JSP页面本身的缓存(静态资源缓存由版本号 ?v= 控制) response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); response.setHeader("Pragma", "no-cache"); response.setDateHeader("Expires", 0); %>


http://www.jsqmd.com/news/1003947/

相关文章:

  • 卖家福音:一键生成详情页、主图、模特穿戴图,省时80%
  • XUnity自动翻译器:打破语言壁垒的终极Unity游戏本地化指南
  • DPDK ACL分类器设计深度解析:从148Mpps跌到72Mpps,一次ACL规则膨胀引发的性能雪崩
  • 别再死记硬背了!用这5个SV功能覆盖率实战案例,帮你彻底搞懂covergroup和coverpoint
  • MATLAB一键运行的IEEE标准测试系统潮流计算包(4/14/30/57/118/300节点全支持)
  • 电赛备赛避坑指南:从‘采样不准’到‘稳流失效’,我的稳压电源调参血泪史
  • 深度解析NCMconverter:网易云音乐加密格式破解与音频转换技术实现
  • 告别静态地图!用Cesium CallbackProperty打造会呼吸的动态三维场景
  • 为什么程序员都在用 Claude 写代码?实测 Debug 能力与大模型选型攻略
  • 从Excel到数据库:数据迁移中日期格式混乱的终极解决方案(含Python/Pandas操作)
  • 免费音频转换工具终极指南:如何用FlicFlac轻松处理7种音频格式
  • A2B音频系统设计实战:如何用SigmaStudio为你的AD242x功放/MIC配置TDM与I2S格式?
  • 保姆级教程:用GD32F470的Timer1实现精准1ms定时(基于200MHz系统时钟)
  • 2026实力之选:黄江激光焊接与精密五金焊接加工企业综合评估 - 品牌发掘
  • 保姆级教程:用RTKLIB的rtknavi模块,5分钟搞定实时PPP定位(附武汉大学/上海天文台Ntrip账号申请)
  • 告别信号玄学:手把手教你用PCIe 4.0的Lane Margining功能实测信号余量
  • STM32F103用硬件SPI跑TLE5012B的三线SSC通信,带角度/速度/温度实时读取和寄存器配置
  • 利用深度学习目标检测框架yolov8YOLO8训练使用草莓成熟度 数据集
  • Page Assist:在浏览器中无缝使用本地AI模型的终极指南
  • erm:去除语音语气词的本地工具,解决手动删除痛苦!
  • Pandas多维聚合实战:构建可切片、上卷、下钻的数据立方体
  • VS2010一键编译的eXosip2 4.0.0 + osip2 4.0.0完整工程包(含Win32/MFC支持)
  • AI-产品经理实战项目必修课
  • 2026年包头保安岗亭选购指南:从材质到服务的多维度行业观察 - 优质品牌商家
  • 3步搭建浏览器本地AI助手:Page Assist完整指南
  • Linux ioc_timer_fn iocost定时器与hweight更新
  • 虚拟化软件替代方案:如何在3个步骤内找到最适合你的开源解决方案?
  • 2026年台州杭州岗亭选购指南:区域服务、技术适配与行业趋势深度分析 - 优质品牌商家
  • 2026年北京公司注册代理机构综合能力分析:服务范围、团队经验与真实案例解读 - 优质品牌商家
  • 2026河北油管厂家排行揭秘,这样选才不踩坑