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

Ken*_*and 7 java redirect jsp jspinclude

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

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

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

System.err.println("Redirecting!");
response.sendRedirect("http://www.google.com");
return;
Run Code Online (Sandbox Code Playgroud)

我看到"重定向!" 登录到控制台,但页面继续并正常呈现.我有curl为我转储标题,并看到响应是HTTP/1.1 200 OK这样,它肯定不会发送302重定向.

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

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

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

Bal*_*usC 12

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

...

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

...

HttpServletResponse#sendRedirect()基本上设置HTTP响应状态302和HTTP Location报头到目标URL.因此完全被忽视了.

更深层次的问题是您滥用JSP作为页面控制器/过滤器.实际上你应该使用普通的servlet过滤器类,它在JSP之前运行得很远.