AEM的HTL(也称为Sightly)具有特殊的习惯用法,用于重新格式化URL属性,例如
<a href="${properties.path @ extension = 'html'}">
这个成语的目的是双重的
.html
附加到通过pathbrowser
字段创作的内部链接/content/projectname
的资源映射不幸的是,这个精心设计的功能有几个问题:
.html
结尾的外部链接。我的团队现在的任务是修复由于过度使用此extension = 'html'
技巧而导致的许多缺陷,我们希望以最小的回归风险来一致,快速地修复所有缺陷。
是否有快速解决方案,最好是可以通过无意识搜索/替换extension = 'html'
的每次出现而重复进行的操作?
答案 0 :(得分:0)
我可以建议结合使用uri上下文和从服务器端向资源URL添加.html扩展名。
使用@ 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"/>
再次使用@ 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>
不能在同一元素中同时使用@扩展名和@上下文。
您可以像这样<a href="${path}.html">Title</a>
附加.html,或者更好的方法是在悬带模型级别解决此问题,也许是类似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中可用的上下文表达式选项。