UniGui禁用缓存

今天有人问到如何禁用缓存,原因是引用了第三方js,css等文件,但是因为缓存的原因,修改后没有及时生效。

首先纠正一点,地址后加?不会禁用缓存

可以看到,后面即使加了?但仍然是from memory cache。对于浏览器而言所有的文件加载都是Get方法,加不加?不影响。只要地址不变,就会使用缓存。

下面介绍几种禁用缓存的方法。

方法一:

在ServerModule的OnHTTPCommand事件中,加入以下代码

AResponseInfo.CacheControl := 'max-age=0, no-cache, no-store, must-revalidate, proxy-revalidate';

此代码的作用是禁止浏览器缓存,这样就不会缓存,每次请求都会向服务加载。

可以看到每次刷新都没有使用缓存,但是此方法有缺点,只支持exe模式, exe模式下所有的请求,无论是数据还是文件,都是由unigui服务器进行处理,而isapi模式下,文件请求都是由iis进行处理,所以没有执行到此代码,也就不会生效(iis可以设置自定义header来禁用缓存),同理HyperServer下也不生效,因为hy下文件处理由hy完成,同样没有执行到此代码。另外一个确定是会增加服务器压力,不缓存,那么所有文件在每次刷新的时候都会重新加载,就会增加服务器压力。解决方案是针对不同的文件进行禁用缓存,使用以下代码:

if ARequestInfo.URI = '/files/script.js' then

AResponseInfo.CacheControl := 'max-age=0, no-cache, no-store, must-revalidate, proxy-revalidate';

这样可以精确到单个文件进行缓存禁用。

TIPS:高级用法

可以在servermodule的onhttpcommand事件里增加一下代码

{$IFDEF DEBUG}

AResponseInfo.CacheControl := 'max-age=0, no-cache, no-store, must-revalidate, proxy-revalidate';

{$ENDIF}

这样可以在调试的时候不启用缓存,在调试过程中避免因为缓存、更换unigui版本、修改js/css文件等引起的报错。

方法二:

使用入口文件,新建一个js文件,写入以下代码

复制代码
document.write("<script type='text/javascript' src=' 
/files/script.js?t=" + Date.now() + "'><\/script>");

多个文件向下追加即可,其他文件均由此文件进行引入,不在单独进行引入。此代码的作用是在引入文件的时候后面追加t=当前时间这样每次加载的url地址就都不一样也就不会使用缓存。此方法适用各种模式。

相关推荐
虹科网络安全3 小时前
艾体宝新闻|Redis 月度更新速览:2026 年 3 月
数据库·redis·缓存
189228048613 小时前
EMMC32G-TA28闪存EMMCH26M78103CCR
大数据·人工智能·缓存
IT界的老黄牛7 小时前
停电后 Redis 集群两节点起不来:fix 完还报 Bad file format?多部分 AOF 修复的正确姿势
运维·redis·缓存
许彰午10 小时前
CacheSQL:一个面向政务系统的内存缓存数据库中间件
java·数据库·缓存·中间件·面试·开源软件·政务
Lyyaoo.10 小时前
Session粘滞性问题->Redis实现session共享
数据库·redis·缓存
倚楼盼风雨11 小时前
Redis 为什么快
数据库·redis·缓存
6Hzlia11 小时前
Hot 100 刷题计划】 LeetCode 146. LRU 缓存 | C++ 哈希表+双向链表
c++·leetcode·缓存
Controller-Inversion11 小时前
146. LRU 缓存
缓存
yuzhiboyouye11 小时前
java redis(缓存)
java·redis·缓存
TechWayfarer1 天前
IP归属地运营商生产落地进阶:缓存+降级+灰度对账全解析
网络·python·网络协议·tcp/ip·缓存