0

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

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

<%
String redirectURL = "/client/index.jsp";
response.sendRedirect(redirectURL);
%>
<t:login title="Client Login">
..........
</t: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,但它仍然停留在同一页面上,没有任何错误。

4

2 回答 2

1

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

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

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

来自RequestDispatcher#include()文档:

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

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

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

于 2015-01-20T03:51:43.620 回答
0

你的代码中有这个

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

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

于 2015-01-20T06:57:07.973 回答