我在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但它仍然保持在同一页面而没有任何错误。
答案 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。