【问题标题】:Idiomatic way to overcome difficulties with `@extension = 'html'` in AEM 6.3 Sightly/HTL?在 AEM 6.3 Sightly/HTL 中使用 `@extension = 'html'` 克服困难的惯用方法?
【发布时间】:2018-12-26 19:16:47
【问题描述】:

AEM 的 HTL(又名 Sightly)具有用于重新格式化 URL 属性的特殊习语,例如

<a href="${properties.path @ extension = 'html'}">

这个成语的目的有两个

  1. .html 附加到通过pathbrowser 字段创作的内部链接
  2. 应用已配置为剥离/content/projectname 的资源映射

不幸的是,这个善意的功能有几个问题:

  • 它不适用于资源链接,例如DAM 中的 PDF 文件。
  • 它不适用于不以.html 结尾的外部链接。
  • 它会转义包含查询字符串参数的 URL 中的“&”,从而破坏链接。

我的团队现在的任务是修复因过度使用此 extension = 'html' 技巧而导致的数十个缺陷,我们希望始终如一地快速修复所有这些缺陷,并将回归风险降至最低。

是否有快速解决方法,最好是通过盲目搜索/替换每次出现的extension = 'html' 来重复某些事情?

【问题讨论】:

    标签: aem sling sightly


    【解决方案1】:

    我可以建议结合使用 uri 上下文并从服务器端向资源 URL 添加 .html 扩展名。

    • 它不适用于资源链接,例如DAM 中的 PDF 文件。

    使用@ context = 'uri'hrefsrc 属性的默认上下文,并且不显式添加.html 扩展。

    输入 -

    &lt;a href="${'/content/dam/repl/en.pdf'}"&gt;Resource Link&lt;/a&gt; 使用默认的 uri 上下文。

    输出 -

    &lt;a href="/content/dam/repl/en.pdf"&gt;Resource Link&lt;/a&gt;

    在任何其他 html 属性上,使用属性上下文 - @ context='attribute'

    输入 -

    &lt;div data-link="${'/content/dam/repl/en.pdf' @ context='attribute'}"/&gt;

    输出 -

    &lt;div data-link="/content/dam/repl/en.pdf"/&gt;


    • 它不适用于不以 .html 结尾的外部链接。
    • 它会转义包含查询字符串参数的 URL 中的“&”,从而破坏链接。

    再次使用@ context = 'uri',不会在 URL 中转义 &,也可以与选择器和 # 参数一起使用。增加了 XSS 保护的优势。

    输入 -

    &lt;a href="${'http://www.reddit.com.selector1.selector2?a=1&amp;b=2&amp;c=3'}"&gt;URI context&lt;/a&gt;

    输出 -

    &lt;a href="http://www.reddit.com.selector1.selector2?a=1&amp;b=2&amp;c=3"&gt;URI context&lt;/a&gt;

    • 将 .html 附加到内部资源 URL

    你不能在同一个元素中同时使用@extension 和@context。 您可以像 &lt;a href="${path}.html"&gt;Title&lt;/a&gt; 这样附加 .html,或者更好的方法是在 sling 模型级别解决这个问题,可能是这样的 util 方法。

    public static String getUrl(String link, String extension, ResourceResolver resourceResolver) {
            String updatedLink = "";
            if (link != null) {
                Resource pathResource = resourceResolver.getResource(link);
                // check if resource exists
                if (pathResource != null) {
                    // append .html
                    updatedLink = resourceResolver.map(link) + extension;
                }
            }
            return updatedLink;
        }
    

    旁注:出于显而易见的原因避免使用@ context='unsafe' - 完全禁用 xss 保护。

    检查this 以获取可用的上下文表达式选项。

    【讨论】:

      猜你喜欢
      • 2018-07-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-20
      相关资源
      最近更新 更多