我有一个jsp文件,其中包括另一个用于检查某些值的jsp文件,例如:
<jsp:include page="setup.jsp" />
在setup.jsp内部,我有一些条件代码,这些条件代码确定会话中是否设置了一些需要的值,如果没有,则将它们重定向到另一个页面。或至少应该如此,但是重定向似乎被忽略了。
System.err.println("Redirecting!"); response.sendRedirect("http://www.google.com"); return;
我看到“正在重定向!” 记录到控制台,但页面继续并正常呈现。我已经为我卷曲了标题,并且看到响应是HTTP/1.1 200 OK肯定的,因此它绝对没有发送302重定向。
HTTP/1.1 200 OK
任何想法是什么问题,我该如何解决?
编辑:我已验证我的答复尚未提交。response.isCommitted()返回false表示状态代码和标头尚未发送。
response.isCommitted()
false
编辑2:我尝试response.sendRedirect()在其他许多地方打电话,发现我可以在之前成功重定向。JSP内部的重定向似乎被忽略了,如果我尝试在jsp之后进行正确的重定向,那么我将收到一个非法状态异常,因为响应已经提交。
response.sendRedirect()
该<jsp:include>封面下使用RequestDispatcher#include()。单击链接以查看javadoc。以下是相关性摘录(强调我的意思):
<jsp:include>
RequestDispatcher#include()
… ServletResponse对象的路径元素和参数与调用者的参数保持不变。 所包含的servlet无法更改响应状态代码或设置标头。 任何进行更改的尝试都将被忽略。 …
…
ServletResponse对象的路径元素和参数与调用者的参数保持不变。 所包含的servlet无法更改响应状态代码或设置标头。 任何进行更改的尝试都将被忽略。
在HttpServletResponse#sendRedirect()基本上设置HTTP响应状态302和HTTP Location报头到目标URL。因此,它完全被忽略。
HttpServletResponse#sendRedirect()
302
Location
更深层的问题是您正在滥用JSP作为页面控制器/过滤器。实际上,您应该为此使用普通的servlet或过滤器类,该类早于JSP运行。