问题描述
我正在尝试将域中不存在的页面转到404页面。我需要将404页与其他页区分开。但是,我不知道该怎么做。而且下面的东西不起作用。
@Component(service = Filter.class,property = {
"service.ranking=" + Integer.MIN_VALUE})
@SlingServletFilter(scope = {SlingServletFilterScope.REQUEST},pattern = "/content/foo/.*",resourceTypes = "cq:Page",extensions = {"html"},methods = {"GET"})
public class NotFoundFilter implements Filter {
private static final String DEFAULT_METHOD = "GET";
@Reference
private UrlOperationsManager urlOperationsManager;
@Reference
private RequestResponseFactory requestResponseFactory;
@Override
public void init(FilterConfig filterConfig) throws servletexception {
}
@Override
public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException,servletexception {
if (!(request instanceof SlingHttpServletRequest) ||
!(response instanceof SlingHttpServletResponse)) {
chain.doFilter(request,response);
return;
}
SlingHttpServletResponse slingResponse = (SlingHttpServletResponse) response;
//this condition here is not working since slingResponse has no getStatusCode method.
if(slingResponse.getStatusCode() == 404) {
//do something
}
chain.doFilter(request,response);
}
@Override
public void destroy() {
}
}
解决方法
您可以通过实现自己的HttpServletResponseWrapper
保存值并稍后访问它来解决此问题。 Sling实现与通用Servlet API略有不同(至少就此特定机制而言),在How can I get the HTTP status code out of a ServletResponse in a ServletFilter?
但是,如果您打算为给定的状态码提供特定的错误文档,我将采取不同的方法。假设您使用Dispatcher,则可以让Web服务器来处理它。
如果使用Apache,则可以启用正式的AEM项目原型comes with a few simple examples。详细信息将取决于您的站点结构,但要点是,可以使用ErrorDocument
directive提供类似的配置,以指向相对于文档根目录的缓存错误页面,通常使该页面使用内容可编辑的错误页面。
某些错误(尤其是HTTP 5 **系列)可能会更加棘手,因为它们通常在AEM本身出现问题时发生,因此请务必确保始终提供完全静态的版本。