RuntimeException导致200 OK状态

问题描述 投票:0回答:1

我拥有:AEM 6.4实例。如果代码中的某处出现RuntimeExcepption错误,则页面返回200 OK状态。为了解决这个问题,我尝试做过滤器。

@SlingFilter( order = Integer.MIN_VALUE, scope = SlingFilterScope.REQUEST)
public class RuntimeExceptionFilter implements javax.servlet.Filter {

    @Override
    public final void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        SlingHttpServletResponse slingResponse = (SlingHttpServletResponse) response;

        try {
            chain.doFilter(request, response);
        } catch (RuntimeException ex) {
            slingResponse.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        }
    }
}

现在我可以捕获请求,这将导致RuntimeException,但是slingResponse.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);

返回我“ java.lang.IllegalStateException:响应已经提交”。可能是什么原因呢?或者,如果发生RuntimeException,可以通过其他方法使页面返回500状态?

堆栈跟踪:

Caused by: java.lang.IllegalStateException: Response has already been committed
    at org.apache.sling.engine.impl.SlingHttpServletResponseImpl.checkCommitted(SlingHttpServletResponseImpl.java:424) [org.apache.sling.engine:2.6.16]
    at org.apache.sling.engine.impl.SlingHttpServletResponseImpl.sendError(SlingHttpServletResponseImpl.java:170) [org.apache.sling.engine:2.6.16]
    at org.apache.sling.engine.impl.SlingHttpServletResponseImpl.sendError(SlingHttpServletResponseImpl.java:165) [org.apache.sling.engine:2.6.16]
    at javax.servlet.http.HttpServletResponseWrapper.sendError(HttpServletResponseWrapper.java:127) [org.apache.felix.http.servlet-api:1.1.2]
    at my.project.RuntimeExceptionFilter.doFilter(RuntimeExceptionFilter.java:49)
java servlets filter sling aem-6
1个回答
0
投票

如异常文本所述,在引发异常之前已经发送了响应。这里讨论了类似的问题:Response has aready been committed

[首先尝试确定在什么时候返回了HTTP响应。一旦找到可以解决的方法。

我对AEM内部不是很熟悉(几乎没有使用它的动手经验,但是很可能在某个时候触发了一些包装器(可能会考虑到方面)并返回200的HTTP响应。

© www.soinside.com 2019 - 2024. All rights reserved.