【问题标题】:Cannot redirect when the script is include by RequestDispatcherRequestDispatcher 包含脚本时无法重定向
【发布时间】:2015-01-20 02:56:53
【问题描述】:

我在 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 显示,但仍停留在同一页面,没有任何错误。

【问题讨论】:

  • 重定向是有条件的吗?发布更多代码。
  • 是的,我已经调试并确保代码正在执行,login_handler.jsp 能够打印,问题是通过 sendRedirect 运行后页面没有重定向
  • 我实际上的意思是如果您的 JSP 中有任何 if-else 块以及不会发生重定向的任何条件。 login_handler.jsp 是否只包含这两行?
  • 感谢您的宝贵时间,我已经修改了我的问题以澄清正在执行 sendRedirect

标签: java jsp redirect requestdispatcher


【解决方案1】:

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

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

禁止服务器端包含更改响应状态代码,当您使用sendRedirect() 时会发生这种情况。任何此类尝试都会被容器简单地忽略。

来自RequestDispatcher#include() 文档:

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

此限制是设计使然。该规范将包含的 Web 组件视为 来宾,即它无法引导流程,并且任何此类尝试都将被正确地忽略而不是引发异常 可能允许包含您可能拥有的任何 servlet。

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

【讨论】:

  • checkhandler 是 login.jsp 的一部分,我不能为此使用 forward
  • 此限制是设计使然。请参阅文档。我添加了对我的答案的引用。
【解决方案2】:

你的代码中有这个

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

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

【讨论】:

  • 打印是为了让操作人员了解该部分的执行情况,我更正了我的问题,谢谢
  • 我认为您正在以某种方式使用“响应”对象(在您的 3 个 jsps 中的某处)。这就是阻止您重定向的原因。剩下的就是弄清楚谁和如何。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-06
  • 1970-01-01
  • 2012-02-02
  • 2014-07-06
  • 2013-11-16
相关资源
最近更新 更多