0

jsp のリダイレクトに問題があります。ページはそのまま残り、エラーは発生しません。

login.jsp のようにスクリプトを直接記述すると、リダイレクトを行うことができます

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

しかし、ファイルを3つに分割してインクルードするとリダイレクトできません。以下は私の実装です。

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パス要素があり、パラメーターは呼び出し元から変更されません。含まれているサーブレットは、 応答ステータス コードを変更したり、ヘッダーを設定したりすることはできません。変更しようとしても無視されます。

この制限は仕様によるものです。仕様では、含まれている Web コンポーネントをゲストとして扱います。つまり、フローを指示することはできず、そのような試みは例外をスローする代わりに正しく無視され、使用しているサーブレットのインクルードを許可する可能性があります。

ホスティング 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 に答える