微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 AEM 中的页面模板上禁用调度程序缓存?

如何解决如何在 AEM 中的页面模板上禁用调度程序缓存?

我有模板类型“帐户”的页面,如果存在某些 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 的回复:

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

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

,

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

如果您在 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 配置模板

,

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

有些选项是

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。