如何在 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的回复:

如果您想禁用在调度程序中缓存您的页面,您可以按照此处所述在调度程序配置文件中添加规则。

https://experienceleague.adobe.com/docs/experience-manager-dispatcher/using/configuring/dispatcher-c...

如果您想通过 AEM 后端处理此问题,则以下是 2 个选项。

  1. 要禁用调度程序缓存添加了特定组件的页面,请在该特定组件模型中设置响应 header class。

    @Model(适应性=SlingHttpServletRequest.class, defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL) public class 组件模型 {

     @Inject
     private SlingHttpServletResponse response;
    
     @PostConstruct
     protected void init() {
         response.setHeader("Dispatcher", "no-cache");
     }
    

    }

  2. 如果您对特定页面有此用例而不是基于特定组件,则创建通用缓存控制模型 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。

一些选项是

  1. 如果 header 中的数据没有安全限制或 cookie 通过 javascript client-side
  2. 操纵 header
  3. 使用 Sling Dynamic include 通过 SSI 或 Ajax
  4. 加载 header

https://sling.apache.org/documentation/bundles/dynamic-includes.html