在JSP中获取Response.End()行为

时间:2009-08-03 18:48:19

标签: jsp tomcat

提前感谢所有人 -

我知道关闭jspwriter / outputstream并返回作为停止在主上下文中进一步执行的方法。有没有人找到一种方法来阻止主要上下文之外的执行?根据我对jsp如何“编译”等的理解我不认为这是可能的,但我想我应该看看是否有人有任何聪明的解决方案 -

谢谢,

萨姆

1 个答案:

答案 0 :(得分:0)

我认为这是一种通常应该避免的反模式。仅仅因为ASP.NET允许你这样做并不意味着它是一个很好的功能。话虽这么说,您可以通过实现servlet请求过滤器来模拟行为。您需要在web.xml中配置此过滤器,以过滤JSPServlet和您想要中止的其他servlet处理的任何请求。

要使其正常工作,您拥有的任何异常处理代码都需要忽略或重新抛出ServletRequestAbortException

public class CancellableRequestFilter implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    public void destroy() {
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        try {
            chain.doFilter(request, response);
        } catch (ServletRequestAbortException e) {
            //TODO: Maybe flush/close response here.
        }
    }

    public static void endRequest() {
        throw new ServletRequestAbortException();
    }

    public static class ServletRequestAbortException extends RuntimeException {
    }
}

来自JSP的示例调用:

<% com.your.pkg.CancellableRequestFilter.endRequest(); %>