AppWithinMinutes的Sheet页面缓存异常问题及解决方案咨询
禁用AppWithinMinutes Sheet层缓存的解决方法
问题根因
AppWithinMinutes(以下简称AWM)默认对Sheet展示页启用渲染缓存,缓存key仅绑定Sheet页面本身,未绑定当前Sheet承载展示的具体业务文档,导致不同业务文档复用同一份渲染结果,直接引发内容跨页面串扰、硬刷新时内容时隐时现的异常。
实操解决步骤
1. 强制禁用当前Sheet页的渲染缓存
编辑你修改过的AWM Sheet页面,在原有Velocity代码的最顶部加入以下缓存控制逻辑,直接从请求层面和渲染层面关闭缓存:
## 关闭Velocity渲染缓存,设置缓存时长为0 #set ($xcontext.context.setCacheDuration(0)) ## 给HTTP响应加不缓存头,避免浏览器端缓存异常 $response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate") $response.setHeader("Pragma", "no-cache") $response.setHeader("Expires", "0")
2. 修复上下文变量串值问题
原有代码直接调用顶层$doc变量取标题,在AWM Sheet的上下文复用场景下,很容易取到缓存中残留的上一个文档对象。需要显式从当前请求上下文获取目标文档,把原有代码中的标题赋值逻辑替换为:
## 显式获取当前请求对应的业务文档,避免上下文串值 #set ($currentDoc = $xcontext.context.get("doc")) #set ($title = $currentDoc.title)
3. 补全代码边界判断,避免异常缓存
原有字符串截断逻辑未做长度校验,当文档标题长度小于7位时会直接抛出Velocity执行异常,异常信息会被缓存进一步加剧串页问题。修正后的完整代码块如下:
<div> #set ($xcontext.context.setCacheDuration(0)) $response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate") $response.setHeader("Pragma", "no-cache") $response.setHeader("Expires", "0") #set ($currentDoc = $xcontext.context.get("doc")) #set ($title = $currentDoc.title) #if ($title.length() >= 7) #set ($newTitle = $title.substring(0,6) + "X" + $title.substring(7, $title.length())) <h2>Applications with a tag: $newTitle</h2> {{PagesByTag tagName=$newTitle/}} #end </div>
4. 永久关闭Sheet页面对象级缓存(管理员操作)
如果上述代码级修改后仍有缓存残留,可通过页面对象配置永久关闭缓存:
- 使用管理员账号进入AWM Sheet页的编辑模式,切换到「对象」标签
- 查找页面上是否存在
XWiki.CacheClass对象,不存在则手动添加该对象 - 将对象中的
cacheDuration属性值设置为0 - 保存页面即可,该配置会让XWiki渲染引擎永远不对该Sheet页做持久化渲染缓存。
内容的提问来源于stack exchange,提问作者Andy Johnson
相关产品推荐
相关产品推荐

