如何在 AEM 中的页面模板上禁用调度程序缓存?
How to disable dispatcher cache on page template in AEM?
我有模板类型为“帐户”的页面,如果存在某些 cookie,它会带来一个特殊的 header。但是,当我删除 cookie 并刷新页面时,特殊的 header 仍然存在,并且只有在我重新发布页面时才会消失。这是由于调度员。我想在从该模板创建的页面上禁用调度程序。我已经看到可以使用 JSP.
上的此代码禁用调度程序
response.setHeader("Dispatcher", "no-cache");
但不确定在非 JSP 项目中在哪里使用它。
根据您的实施语言,您可能有办法在响应 object.
上设置 headers
如果您在 Sling servlet 中,无论是在 doGet() 还是 doPost 方法中,您都可以使用方法 response.setHeader(String name, String value);
我在下面的 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 个选项。
要禁用调度程序缓存添加了特定组件的页面,请在该特定组件模型中设置响应 header class。
@Model(适应性=SlingHttpServletRequest.class, defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL)
public class 组件模型 {
@Inject
private SlingHttpServletResponse response;
@PostConstruct
protected void init() {
response.setHeader("Dispatcher", "no-cache");
}
}
如果您对特定页面有此用例而不是基于特定组件,则创建通用缓存控制模型 class 并在页脚中包含对该模型 class 的调用基于页面条件检查的级别。
@Model(适应性=SlingHttpServletRequest.class, defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL)
public class CacheControlModel {
@Inject
private SlingHttpServletResponse response;
@PostConstruct
protected void init() {
response.setHeader("Dispatcher", "no-cache");
}
}
HTML
我想在Filter中设置headers是有意义的,它会提供更多的灵活性和可维护性。
@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 配置配置模板
完全禁用缓存来处理这种情况是不对的,您还应该考虑使用此模板创建页面的选项cache-friendly。
一些选项是
- 如果 header 中的数据没有安全限制或 cookie 通过 javascript client-side
操纵 header
- 使用 Sling Dynamic include 通过 SSI 或 Ajax
加载 header
https://sling.apache.org/documentation/bundles/dynamic-includes.html
我有模板类型为“帐户”的页面,如果存在某些 cookie,它会带来一个特殊的 header。但是,当我删除 cookie 并刷新页面时,特殊的 header 仍然存在,并且只有在我重新发布页面时才会消失。这是由于调度员。我想在从该模板创建的页面上禁用调度程序。我已经看到可以使用 JSP.
上的此代码禁用调度程序response.setHeader("Dispatcher", "no-cache");
但不确定在非 JSP 项目中在哪里使用它。
根据您的实施语言,您可能有办法在响应 object.
上设置 headers如果您在 Sling servlet 中,无论是在 doGet() 还是 doPost 方法中,您都可以使用方法 response.setHeader(String name, String value);
我在下面的 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 个选项。
要禁用调度程序缓存添加了特定组件的页面,请在该特定组件模型中设置响应 header class。
@Model(适应性=SlingHttpServletRequest.class, defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL) public class 组件模型 {
@Inject private SlingHttpServletResponse response; @PostConstruct protected void init() { response.setHeader("Dispatcher", "no-cache"); }
}
如果您对特定页面有此用例而不是基于特定组件,则创建通用缓存控制模型 class 并在页脚中包含对该模型 class 的调用基于页面条件检查的级别。
@Model(适应性=SlingHttpServletRequest.class, defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL) public class CacheControlModel {
@Inject
private SlingHttpServletResponse response;
@PostConstruct
protected void init() {
response.setHeader("Dispatcher", "no-cache");
}
}
HTML
我想在Filter中设置headers是有意义的,它会提供更多的灵活性和可维护性。
@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 配置配置模板
完全禁用缓存来处理这种情况是不对的,您还应该考虑使用此模板创建页面的选项cache-friendly。
一些选项是
- 如果 header 中的数据没有安全限制或 cookie 通过 javascript client-side 操纵 header
- 使用 Sling Dynamic include 通过 SSI 或 Ajax 加载 header
https://sling.apache.org/documentation/bundles/dynamic-includes.html