当RequestDispatcher包含脚本时,无法重定向

时间:2015-01-20 02:56:54

标签: java jsp redirect requestdispatcher

我在jsp中遇到重定向问题,页面仍然存在并且不会抛出任何错误。

当我直接在我的login.jsp中编写脚本时,我可以进行重定向

<%
String redirectURL = "/client/index.jsp";
response.sendRedirect(redirectURL);
%>
<t:login title="Client Login">
..........
</t:login>

但是当我将文件拆分为三个并包含它时,我无法重定向。以下是我的实施。

的login.jsp

<%@include file="/include/checkhandler.jsp"%>

checkhandler.jsp - 这是一个脚本,它将检查处理程序文件夹中的文件并在它存在时包含它。

......
request.getRequestDispatcher(handler).include(request, response);
......

login_handler.jsp这是调度程序将包含的文件

String redirectURL = "/client/index.jsp";
response.sendRedirect(redirectURL);
out.println("hello world");

执行此脚本后,显示了hello world但它仍然保持在同一页面而没有任何错误。

2 个答案:

答案 0 :(得分:1)

您需要使用RequestDispatcher#forward()代替。将 checkhandler.jsp 更改为

request.getRequestDispatcher(handler).forward(request, response);

禁止服务器端包含更改响应状态代码,这是使用sendRedirect()时发生的情况。任何这样的尝试都被容器忽略了。

来自RequestDispatcher#include()文档:

  

ServletResponse对象的路径元素和参数仍然存在   与来电者保持不变。 包含的servlet无法更改   响应状态代码或设置标头;任何改变的尝试都是   忽略。

此限制是设计使然。该规范将网络组件视为来宾,即无法指导流程,任何此类尝试都将被正确忽略而不是抛出异常可能允许包含任何servlet。

只有托管Web组件(执行包含的组件)才能完全控制流以及将响应标头发送到客户端。

答案 1 :(得分:0)

你的代码中有这个

out.println("hello world");
String redirectURL = "/client/index.jsp";
response.sendRedirect(redirectURL);

这不起作用,因为您在写入响应流后无法重定向。重定向在响应头中发送。响应正文不应包含任何html。