AEM Dispatcher缓存异常:页面刷新后JSON请求不命中缓存
我来帮你排查这个AEM Dispatcher缓存的问题——核心现象是刷新页面后首次发起的AJAX JSON请求无法命中缓存,但后续同URL的请求能正常命中,结合你的配置、请求头和日志,我梳理了几个关键问题点和解决方案:
1. 核心原因分析:statfileslevel配置导致的缓存批量失效
从你的Dispatcher日志可以看到,页面刷新后首次请求JSON资源时,缓存文件被判定为“不存在”,但后续请求又能找到缓存。这大概率是statfileslevel配置引发的连锁失效:
- 你设置了
/statfileslevel "1",意味着Dispatcher会在相对于缓存根目录的第1级目录(也就是/cache-dir/content/)创建.stat文件,所有/content/路径下的缓存资源都依赖这个单一的.stat文件判断有效性。 - 当你刷新
sample.html页面时,即使HTML本身命中缓存,Dispatcher可能会重新验证该缓存的有效性(比如浏览器请求带了Cache-Control: no-cache),这会触发/cache-dir/content/.stat文件更新。 - 由于所有
/content/下的缓存(包括你的JSON资源)都关联这个.stat文件,Dispatcher会认为这些JSON缓存已过期,因此首次请求时会重新从发布服务器拉取并重建缓存,第二次请求时新缓存已经生成,就能正常命中了。
2. 针对性解决方案
调整statfileslevel到合适层级
将/statfileslevel的值从1调整为更高的层级(比如3),这样Dispatcher会在更细分的目录下创建.stat文件,避免单一.stat更新导致大量无关缓存失效:
/aemsecuredcontent { // 其他原有配置... /cache { /statfileslevel "3" /allowAuthorized "1" // 其他原有缓存配置... } }
设置为3后,/content/sample/some.query.json/sample/input.json的缓存会关联/cache-dir/content/sample/some.query.json/.stat文件,而sample.html的缓存关联/cache-dir/content/.stat文件,两者的缓存验证不会互相影响。
检查auth_checker的路径覆盖范围
你的auth_checker配置中,允许检查的路径是/content/securedcontent/*,但实际请求的资源路径是/content/sample.html和/content/sample/...,这意味着这些资源不会经过权限校验,可能和/allowAuthorized "1"的配置冲突,导致缓存逻辑异常。建议调整auth_checker的filter覆盖你的实际资源路径:
/aemsecuredcontent { /auth_checker { /url "/bin/permissioncheck" /filter { /0000 { /glob "*" /type "deny" } /0001 { /glob "/content/sample/*" /type "allow" } // 如果有其他受保护路径,一并添加 } // 其他原有auth_checker配置... } // 其他原有配置... }
修正Dispatcher Filter的规则顺序
你当前的filter规则顺序存在风险:先匹配deny *,再匹配allow *query.json*,这会导致除了带query.json的请求外,所有请求(包括sample.html)都被拒绝。如果这是配置片段,建议确保允许HTML请求的规则放在deny *之前:
/aemsecuredcontent { /filter { /2416 { /type "allow" /glob "*.html" } /2417 { /type "allow" /glob "*query.json*" } /2401 { /type "deny" /glob "*" } } // 其他原有配置... }
Dispatcher的filter规则是按顺序匹配,第一个匹配的规则生效,所以允许规则必须放在拒绝规则前面。
3. 验证方法
调整配置后,按以下步骤验证:
- 重启Dispatcher服务,确保新配置生效。
- 访问
sample.html并刷新页面,观察首次AJAX请求的Dispatcher日志,确认是否显示“cache-action: DELIVER”(命中缓存)。 - 多次刷新页面,检查JSON资源是否每次都能命中缓存。
内容的提问来源于stack exchange,提问作者Dileepa

