来自jsp的response.sendRedirect():include被忽略?

时间:2011-07-09 22:49:53

标签: java jsp redirect jspinclude

我有一个jsp文件,其中包含另一个jsp文件来检查某些值,例如:

<jsp:include page="setup.jsp" />

在setup.jsp中,我有一些条件代码,用于确定是否在会话中设置了一些需要的值,如果没有,则将它们重定向到不同的页面。或者至少它应该是,但重定向似乎被忽略了。

System.err.println("Redirecting!");
response.sendRedirect("http://www.google.com");
return;

我看到“重定向!”登录到控制台,但页面继续并正常呈现。我有curl转储标题给我,并看到响应是HTTP/1.1 200 OK所以它肯定没有发送302重定向。

知道问题是什么以及如何解决这个问题?

编辑:我已经确认我的回复尚未提交。 response.isCommitted()返回false,表示状态代码和标题尚未发送。

编辑2:我尝试在许多其他地方调用response.sendRedirect()并发现我可以在之前成功重定向。 JSP中的重定向似乎被忽略了,如果我尝试在jsp之后重定向,那么我会得到一个非法的状态异常,因为响应已经被提交了。

2 个答案:

答案 0 :(得分:11)

<jsp:include>使用了RequestDispatcher#include()。单击链接以查看javadoc。这是相关的摘录(强调我的):

  

...

     

ServletResponse对象的路径元素和参数与调用者保持不变。 包含的servlet无法更改响应状态代码或设置标头;任何改变的尝试都会被忽略。

     

...

HttpServletResponse#sendRedirect()基本上将HTTP响应状态设置为302,将HTTP Location标头设置为目标URL。因此完全被忽视了。

更深层次的问题是您滥用JSP作为页面控制器/过滤器。实际上你应该使用一个普通的servletfilter类来运行远在JSP之前。

答案 1 :(得分:0)

重定向标题(我相信)需要位于页面顶部。查看HTML规范以供参考。

您是否尝试过将其放在页面顶部?代码示例将帮助我们调试...