[英]response.sendRedirect() from jsp:include being ignored?
我有一个 jsp 文件,其中包括另一个 jsp 文件来检查一些值等:
<jsp:include page="setup.jsp" />
在 setup.jsp 中,我有一些条件代码,用于确定是否在 session 中设置了一些需要的值,如果没有,则将它们重定向到不同的页面。 或者至少应该如此,但重定向似乎被忽略了。
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 之后正确重定向,那么我会收到一个非法的 state 异常,因为响应已经提交。
<jsp:include>
在幕后使用RequestDispatcher#include()
。 单击链接以查看 javadoc。 这是相关性的摘录(强调我的):
...
ServletResponse object 的路径元素和参数与调用者的保持不变。 包含的 servlet 不能更改响应状态码或设置标头; 任何进行更改的尝试都会被忽略。
...
The HttpServletResponse#sendRedirect()
basically sets the HTTP response status to 302
and the HTTP Location
header to the target URL. 因此,它完全被忽略了。
更深层次的问题是您滥用 JSP 作为页面控制器/过滤器。 您实际上应该为此使用普通的servlet或过滤器class,它在 JSP 之前运行。
重定向 header (我相信)需要位于页面顶部。 查看 HTML 规范以供参考。
您是否尝试将其放在页面的最顶部? 代码示例将帮助我们调试...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.