我有一个 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 之后立即重定向,则会收到非法状态异常,因为响应已提交。
The <jsp:include>
在幕后使用RequestDispatcher#include()。单击该链接可查看 javadoc。这是相关性的摘录(强调我的):
...
ServletResponse 对象的路径元素和参数与调用者的保持不变。包含的 Servlet 无法更改响应状态代码或设置标头;任何进行更改的尝试都会被忽略。
...
The HttpServletResponse#sendRedirect()基本上将 HTTP 响应状态设置为302
和 HTTPLocation
标头到目标 URL。因此,它完全被忽视了。
更深层次的问题是您滥用 JSP 作为页面控制器/过滤器。你实际上应该使用正常的servlet or filter这个类的运行远远早于 JSP。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)