在 AEM 6.3 Sightly/HTL 中使用“@extension = 'html'”克服困难的惯用方法?
Idiomatic way to overcome difficulties with `@extension = 'html'` in AEM 6.3 Sightly/HTL?
AEM 的 HTL(f.k.a。Sightly)有一个特殊的习语用于重新格式化 URL 属性,例如
<a href="${properties.path @ extension = 'html'}">
这个成语的目的有两个
- 将
.html
附加到通过 pathbrowser
字段编写的内部 link 中
- 应用已配置为剥离的资源映射
/content/projectname
不幸的是,这个用心良苦的功能有几个问题:
- 它不适用于资源 links,例如DAM 中的 PDF 文件。
- 它不适用于不以
.html
结尾的外部 link。
- 它转义了包含查询字符串参数的 URL 中的“&”,打破了 link.
我的团队现在的任务是修复因过度使用此 extension = 'html'
技巧而导致的数十个缺陷,我们希望始终如一地快速修复所有这些缺陷,同时将回归风险降至最低。
是否有快速修复方法,最好是可以通过每次出现 extension = 'html'
时无意识地 search/replace 重复的方法?
我可以建议结合使用 uri 上下文和添加 .html 从服务器端到资源 URL 的扩展。
- 它不适用于资源 links,例如DAM 中的 PDF 文件。
使用 @ context = 'uri'
,href
和 src
属性的默认上下文,不显式添加 .html
扩展名。
输入-
<a href="${'/content/dam/repl/en.pdf'}">Resource Link</a>
使用默认的 uri 上下文。
输出 -
<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"/>
- 它不适用于不以 .html.
结尾的外部 link
- 它转义了包含查询字符串参数的 URL 中的“&”,打破了 link。
再次使用 @ context = 'uri'
,不会在 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。
您可以像这样附加 .html <a href="${path}.html">Title</a>
或者更好的方法是在吊索模型级别解决这个问题,也许是这样的实用方法。
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 以获得可用的上下文表达式选项。
AEM 的 HTL(f.k.a。Sightly)有一个特殊的习语用于重新格式化 URL 属性,例如
<a href="${properties.path @ extension = 'html'}">
这个成语的目的有两个
- 将
.html
附加到通过pathbrowser
字段编写的内部 link 中 - 应用已配置为剥离的资源映射
/content/projectname
不幸的是,这个用心良苦的功能有几个问题:
- 它不适用于资源 links,例如DAM 中的 PDF 文件。
- 它不适用于不以
.html
结尾的外部 link。 - 它转义了包含查询字符串参数的 URL 中的“&”,打破了 link.
我的团队现在的任务是修复因过度使用此 extension = 'html'
技巧而导致的数十个缺陷,我们希望始终如一地快速修复所有这些缺陷,同时将回归风险降至最低。
是否有快速修复方法,最好是可以通过每次出现 extension = 'html'
时无意识地 search/replace 重复的方法?
我可以建议结合使用 uri 上下文和添加 .html 从服务器端到资源 URL 的扩展。
- 它不适用于资源 links,例如DAM 中的 PDF 文件。
使用 @ context = 'uri'
,href
和 src
属性的默认上下文,不显式添加 .html
扩展名。
输入-
<a href="${'/content/dam/repl/en.pdf'}">Resource Link</a>
使用默认的 uri 上下文。
输出 -
<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"/>
- 它不适用于不以 .html. 结尾的外部 link
- 它转义了包含查询字符串参数的 URL 中的“&”,打破了 link。
再次使用 @ context = 'uri'
,不会在 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。
您可以像这样附加 .html <a href="${path}.html">Title</a>
或者更好的方法是在吊索模型级别解决这个问题,也许是这样的实用方法。
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 以获得可用的上下文表达式选项。