一尘不染

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

jsp

我有一个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重定向。

任何想法是什么问题,我该如何解决?

编辑:我已验证我的答复尚未提交。response.isCommitted()返回false表示状态代码和标头尚未发送。

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


阅读 273

收藏
2020-06-08

共1个答案

一尘不染

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

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

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

更深层的问题是您正在滥用JSP作为页面控制器/过滤器。实际上,您应该为此使用普通的servlet或过滤器类,该类早于JSP运行。

2020-06-08