我正在尝试将最后修改日期添加到我们的CMS(Jahia)服务页面的html源代码中,以使其在响应标头中显示为属性。
这对于我们的搜索引擎索引编制是必需的。
我尝试在head标签中添加以下语法,但是没有一个允许修改后的日期出现在响应标题中:
<meta name="dcterms.modified" content="Mon, 09 Apr 2018 11:41:11 GMT">
<meta name="DCTERMS.modified" content="Mon, 09 Apr 2018 11:41:11 GMT">
<meta http-equiv="last-modified" content="Mon, 09 Apr 2018 11:41:11 GMT">
<meta http-equiv="Last-Modified" content="Mon, 09 Apr 2018 11:41:11 GMT">
(这些日期通过fmt:formatDate模式=“ EEE,dd MMM yyyy HH:mm:ss z”解析)。
我是否错误地假设可以将head标签内添加的meta标签添加到header中?我在W3Schools网站上读到,http-equiv的唯一属性是
<meta http-equiv="content-type|default-style|refresh">
所以这可能就是该语法不起作用的原因(尽管我可以在网上找到对该语法的引用)。
预先感谢您的帮助。
答案 0 :(得分:1)
在Jahia支持团队的帮助下,我添加了带有源代码的过滤器类,以将最后修改日期添加到响应标头中,并将该类添加到配置中。
首先,您必须添加spring配置。您可以将其放在\ src \ main \ resources \ META-INF \ spring
中的xml文件中<bean id="ResponseNewestModifFilter" class="org.jahia.modules.lastmodif.filters.ResponseNewestModifFilter">
<property name="priority" value="12" />
<property name="description" value="Set Last Modif date in response header"/>
<property name="applyOnModes" value="live,preview" />
<property name="applyOnConfigurations" value="page" />
</bean>
然后添加使用addDateHeader方法的过滤器类(继承自AbstractFilter类),
package org.jahia.modules.lastmodif.filters;
import javax.jcr.RepositoryException;
import org.jahia.modules.lastmodif.taglib.NewestLastModifTag;
import org.jahia.services.render.RenderContext;
import org.jahia.services.render.Resource;
import org.jahia.services.render.filter.AbstractFilter;
import org.jahia.services.render.filter.RenderChain;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ResponseNewestModifFilter extends AbstractFilter {
private static final Logger logger = LoggerFactory
.getLogger(ResponseNewestModifFilter.class);
@Override
public String execute(String previousOut, RenderContext renderContext,
Resource resource, RenderChain chain) throws Exception {
try {
if (renderContext.getResponse().getHeader("Last-Modified") != null) {
renderContext.getResponse().setDateHeader(
"Last-Modified",
NewestLastModifTag.getNewestLastModifDateOfPage(
resource.getNode()).getTime());
} else {
renderContext.getResponse().addDateHeader(
"Last-Modified",
NewestLastModifTag.getNewestLastModifDateOfPage(
resource.getNode()).getTime());
}
} catch (RepositoryException ex) {
logger.error("Error set Last-Modified reponse header", ex);
}
return previousOut;
}
}
此类引用自定义标记库(NewestLastModifTag),该标记库可确保查询所有子节点以获取上次修改日期
package org.jahia.modules.lastmodif.taglib;
import java.util.Calendar;
import javax.jcr.RepositoryException;
import org.jahia.services.content.JCRNodeIteratorWrapper;
import org.jahia.services.content.JCRNodeWrapper;
public class NewestLastModifTag {
public static java.util.Date getNewestLastModifDateOfPage(org.jahia.services.content.JCRNodeWrapper node) throws RepositoryException {
if (node.hasNodes()) {
return getSubnodesWithNewerDate(node, node.getProperty("jcr:lastModified").getDate()).getTime();
}
return node.getProperty("jcr:lastModified").getDate().getTime();
}
private static Calendar getSubnodesWithNewerDate(JCRNodeWrapper node, Calendar date) throws RepositoryException {
JCRNodeIteratorWrapper nodes = node.getNodes();
while (nodes.hasNext()) {
JCRNodeWrapper snode = (JCRNodeWrapper)nodes.next();
if (snode.isNodeType("jnt:page")) {
continue;
}
if (snode.hasProperty("jcr:lastModified") && snode.getProperty("jcr:lastModified").getDate().after(date)) {
date = snode.getProperty("jcr:lastModified").getDate();
}
date = getSubnodesWithNewerDate(snode, date);
}
return date;
}
}
答案 1 :(得分:0)
您可以将任何元数据包含在Jahia为您的页面生成的head html中。 这是我们其中一个页面的html输出示例:
<meta name="dcterms.created" content="Mon May 26 08:06:56 CEST 2018" />
<meta name="dcterms.modified" content="Tue Oct 30 10:40:43 CET 2018" />
<meta name="dcterms.issued " content="Wed Oct 31 09:09:53 CET 2018" />
为了检索它们,您需要使用当前页面节点:
<c:set var="pageNode" value="${jcr:getParentOfType(currentNode, 'jnt:page')}"/>
<c:if test="${empty pageNode}">
<c:choose>
<c:when test="${jcr:isNodeType(renderContext.mainResource.node, 'jnt:page')}">
<c:set var="pageNode" value="${renderContext.mainResource.node}"/>
</c:when>
<c:otherwise>
<c:set var="pageNode" value="${jcr:getParentOfType(renderContext.mainResource.node, 'jnt:page')}"/>
</c:otherwise>
</c:choose>
</c:if>
根据Jahia API,您可以检索以下页面属性:
<c:set var="dateOfCreation" value="${pageNode.creationDateAsDate}" />
<c:set var="dateOfLastModification" value="${pageNode.lastModifiedAsDate}" />
<c:set var="dateOfLastPublication" value="${pageNode.lastPublishedAsDate}" />
然后将它们输出到您的组件视图或模板中:
<c:if test="${!empty dateOfCreation}"><meta name="dcterms.created" content="${fn:escapeXml(dateOfCreation)}" /></c:if>
<c:if test="${!empty dateOfLastModification}"><meta name="dcterms.modified" content="${fn:escapeXml(dateOfLastModification)}" /></c:if>
<c:if test="${!empty dateOfLastPublication}"><meta name="dcterms.issued " content="${fn:escapeXml(dateOfLastPublication)}" /></c:if>