代码之家  ›  专栏  ›  技术社区  ›  Alex R

用aem6.3 Sightly/HTL中的'@extension='html''克服困难的惯用方法?

  •  0
  • Alex R  · 技术社区  · 7 年前

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

    这个成语有两个目的

    1. 追加 .html 到通过 pathbrowser 领域
    2. 应用已配置为剥离的资源映射 /content/projectname

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

    • 如果外部链接没有 .
    • 它转义包含查询字符串参数的url中的“&”,从而断开链接。

    我的团队现在的任务是修复由于过度使用而导致的数十个缺陷 extension = 'html' 诀窍,我们希望以最小的倒退风险,始终如一地迅速解决所有问题。

    是否有一个快速的解决方法,最好是通过无意识地搜索/替换 ?

    1 回复  |  直到 7 年前
        1
  •  0
  •   SubSul    7 年前

    我可以建议组合使用uri上下文和从服务器端向资源url添加.html扩展。

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

    使用 @ context = 'uri' ,的默认上下文 href src .html 扩展。

    输入 -

    <a href="${'/content/dam/repl/en.pdf'}">Resource Link</a>

    输出 -

    <a href="/content/dam/repl/en.pdf">Resource Link</a>

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

    -

    <div data-link="${'/content/dam/repl/en.pdf' @ context='attribute'}"/>

    输出 -

    <div data-link="/content/dam/repl/en.pdf"/>


    再次使用 ,无法逃脱 & 在url中,也可以很好地与选择器和#参数配合使用。增加了XSS保护的优势。

    -

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

    -

    <a href="http://www.reddit.com.selector1.selector2?a=1&b=2&c=3">URI context</a>

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

    不能在同一元素中同时使用@extension和@context。 <a href="${path}.html">Title</a> 或者更好的方法是在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 对于可用的上下文表达式选项。

    推荐文章