如何阻止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)
任何想法如何解决这个问题,或其他方式来实现访问被拒绝的页面?
由于
答案 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所建议的那样可能是更合适的解决方案。