SlingServletFilter:在doFilter之前获取状态代码

问题描述

我正在尝试将域中不存在的页面转到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本身出现问题时发生,因此请务必确保始终提供完全静态的版本。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...