7

我有一个 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 之后立即重定向,那么我会得到一个非法状态异常,因为响应已经提交。

4

2 回答 2

12

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

...

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

...

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

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

于 2011-07-11T11:22:17.970 回答
0

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

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

于 2011-07-09T22:54:01.330 回答