问题描述
我有模板类型“帐户”的页面,如果存在某些 cookie,它会带来一个特殊的标题。但是,当我删除 cookie 并刷新页面时,特殊标题仍然存在,只有在我重新发布页面时才会消失。这是调度员的功劳。我想在从该模板创建的页面上禁用调度程序。我已经看到可以在 JSP 上使用此代码禁用调度程序。
response.setHeader("dispatcher","no-cache");
但不确定在非 JSP 项目中的何处使用它。
解决方法
我在 AEM 论坛上找到了答案,如下:https://experienceleaguecommunities.adobe.com/t5/adobe-experience-manager/disabling-dispatcher-cache-for-some-pages-with-http-header/qaq-p/396124
我引用 Manjunath_K 的回复:
如果您想禁用在调度程序中缓存页面,您可以在调度程序配置文件中添加规则,如下所述。
如果您想通过 AEM 后端处理此问题,那么下面是 2 个选项。
-
要禁用调度程序缓存添加特定组件的页面,请在该特定组件模型类中设置响应标头。
@Model(adaptables = SlingHttpServletRequest.class,defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL) 公共类 ComponentModel {
@Inject private SlingHttpServletResponse response; @PostConstruct protected void init() { response.setHeader("Dispatcher","no-cache"); }
}
-
如果您有针对特定页面而不是基于特定组件的用例,则创建通用缓存控制模型类并根据页面条件检查在页脚级别包含对该模型类的调用。
@Model(adaptables = SlingHttpServletRequest.class,defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL) 公共类 CacheControlModel {
@Inject
private SlingHttpServletResponse response;
@PostConstruct
protected void init() {
response.setHeader("Dispatcher","no-cache");
}
}
HTML
,根据您的实现语言,您可能有办法在响应对象上设置标头。
如果您在 Sling servlet 中,无论是在 doGet() 或 doPost 方法中,您都可以使用方法 response.setHeader(String name,String value);
,我想在过滤器中设置标题是有意义的,它会提供更多的灵活性和可维护性。
@Component(service = Filter.class,property = { "sling.filter.scope=request","sling.filter.pattern=(.*)/<your-website>/(.*)",})
public class CachingPolicyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// Nothing to do here
}
@Override
public void doFilter(ServletRequest request,ServletResponse response,FilterChain filterChain) throws IOException,ServletException {
// check template/resourceType
// add header
filterChain.doFilter(request,response);
}
@Override
public void destroy() {
// Nothing to do here
}
}
可选择通过 OSGI Config 配置模板
,完全禁用缓存来处理这种情况是不正确的,您还应该考虑使使用此模板创建的页面对缓存友好的选项。
有些选项是
- 如果头或 cookie 中的数据没有安全限制,则通过 javascript 客户端操作头
- 使用 Sling Dynamic include 通过 SSI 或 Ajax 加载标头
https://sling.apache.org/documentation/bundles/dynamic-includes.html