Java:JSP停止在页面的其余部分执行

时间:2010-06-02 10:36:31

标签: java jsp servlets redirect

如何阻止JSP执行?

我有JSP通过“转发”将用户从页面中踢出来。

public boolean kickIfNotLoggedIn(
        HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException {
    //code to check if user is logged in
    req.getRequestDispatcher(
            ACCESS_DENIED_PAGE).forward(request, response);
}

在我的JSP中,我有这个代码,在任何HTML输出之前:

<%
            //loginHelper.kickIfNotLoggedIn(request, response);
            if (!loginHelper.kickIfNotLoggedIn(request, response)) {
                return;
            }
%>

如果我不使用return语句,JSP继续处理,我得到一个NullPointerException。如果我使用return语句(通常在网上的各种源上建议),我会得到一个IllegalStateException:

StandardWrapperValve[jsp]: PWC1406: Servlet.service() for servlet jsp threw exception
java.lang.IllegalStateException: PWC3991: getOutputStream() has already been called for this response
        at org.apache.coyote.tomcat5.CoyoteResponse.getWriter(CoyoteResponse.java:717)
        at org.apache.coyote.tomcat5.CoyoteResponseFacade.getWriter(CoyoteResponseFacade.java:226)
        at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:187)

任何想法如何解决这个问题,或其他方式来实现访问被拒绝的页面?

由于

3 个答案:

答案 0 :(得分:2)

你不能这样做。错误消息有点不清楚,但它与在一个资源中开始呈现响应,停止,然后转发到另一个尝试重新开始处理HTTP响应的资源有关。

在所有需要登录的JSP之前,使用servlet Filter在任何JSP甚至触及响应之前重定向。

答案 1 :(得分:1)

使用:

req.getRequestDispatcher(ACCESS_DENIED_PAGE).redirect(request, response);

确保您对检查权限的调用是页面中的第一件事,以避免出现该错误消息。

“正确”的方式当然是一个过滤器,但它可能过于涉及你需要的东西。无论如何看这里:

http://java.sun.com/products/servlet/Filters.html

答案 2 :(得分:0)

关于JSP的一个令人讨厌的事情是任何空间都会导致获取OutputStream(至少在tomcat中)。例如,以下代码将失败:

<%@ page import="javax.servlet.ServletOutputStream" %>

<%
  //note the blank line above^
  ServletOutputStream out = response.getOutputStream();
  //write some data...
%>

由于tomcat将导入和代码块之间的空行视为输出的一部分,因此它将获取编写器并输出两个新行。所以要工作,你需要确保代码中没有无关的字符:

<%@ page import="javax.servlet.ServletOutputStream" %><%
  //no blank line, this will work OK
  ServletOutputStream out = response.getOutputStream();
  //write some data...
%>

现在代码块之间没有字符,因此tomcat不会尝试生成输出。我猜这是你的例外的原因。这说明这是一个快速而肮脏的解决方案,而像Sean所建议的那样可能是更合适的解决方案。