slingservletfilter:在dofilter之前获取状态代码

ut6juiuv  于 2021-07-05  发布在  Java
关注(0)|答案(1)|浏览(376)

我试图使我的域下不存在的网页去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() {
    }

}
juzqafwq

juzqafwq1#

您可以通过实现自己的 HttpServletResponseWrapper 保存值并稍后访问。sling实现与一般的servlet api略有不同(至少就这个特定的机制而言),在如何从servletfilter中的servletresponse中获取http状态代码一节中有详细介绍?
但是,如果您的意图是为给定的状态代码提供特定的错误文档,那么我会采用不同的方法。假设您使用一个调度器,您可以让web服务器来处理它。
正式的aem项目原型附带了几个简单的示例,如果您使用apache,就可以启用这些示例。细节将取决于您的网站结构,但要点是,它可以提供一个类似的配置使用 ErrorDocument 指令指向相对于文档根目录的缓存错误页,通常使其使用内容可编辑的错误页。
有些错误,特别是HTTP5**系列可能会有点棘手,因为它们通常发生在aem本身出现问题时,因此谨慎地确保始终提供完全静态的版本。

相关问题