【问题标题】:How to disable dispatcher cache on page template in AEM?如何在 AEM 中的页面模板上禁用调度程序缓存?
【发布时间】:2021-02-16 20:57:17
【问题描述】:

如果存在某些 cookie,我的模板类型为“帐户”的页面会带来一个特殊的标题。但是,当我删除 cookie 并刷新页面时,特殊标题仍然存在,只有在我重新发布页面时才会消失。这是由于调度员。我想禁用从该模板创建的页面上的调度程序。我已经看到可以在 JSP 上使用此代码禁用调度程序。

response.setHeader("Dispatcher", "no-cache");

但不确定在非 JSP 项目的何处使用它。

【问题讨论】:

    标签: aem dispatcher


    【解决方案1】:

    我在下面的 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. 要禁用调度程序缓存添加特定组件的页面,请在该特定组件模型类中设置响应标头。

      @Model(adaptables = SlingHttpServletRequest.class, defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL) 公共类 ComponentModel {

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

      }

    2. 如果您有针对特定页面而不是基于特定组件的此用例,则创建通用缓存控制模型类并根据页面条件检查在页面页脚级别包含对该模型类的调用。

    @Model(adaptables = SlingHttpServletRequest.class, defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL) 公共类 CacheControlModel {

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

    }

    HTML

    【讨论】:

      【解决方案2】:

      根据您的实现语言,您可能有办法在响应对象上设置标头。

      如果您在 Sling servlet 中,无论是在 doGet() 还是 doPost 方法中,您都可以使用方法 response.setHeader(String name, String value);

      【讨论】:

        【解决方案3】:

        我想在Filter中设置标题是有意义的,它将提供更多的灵活性和可维护性。

        @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 配置模板

        【讨论】:

          【解决方案4】:

          完全禁用缓存来处理这种情况是不对的,您还应该考虑使使用此模板创建的页面对缓存友好的选项。

          有些选项是

          1. 如果标头或 cookie 中的数据没有安全限制,则通过 javascript 客户端操作标头
          2. 使用 Sling Dynamic include 通过 SSI 或 Ajax 加载标头

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-05-26
            • 2015-07-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多