7

いくつかの値などをチェックするための別のjspファイルを含むjspファイルがあります。

<jsp:include page="setup.jsp" />

setup.jsp内に、セッションで必要な値が設定されているかどうかを判断し、設定されていない場合は別のページにリダイレクトする条件付きコードがあります。または、少なくともそうなるはずですが、リダイレクトは無視されているようです。

System.err.println("Redirecting!");
response.sendRedirect("http://www.google.com");
return;

「リダイレクト!」と表示されます。コンソールに記録されますが、ページは続行され、正常にレンダリングされます。ヘッダーをcurlダンプしてもらい、応答がHTTP/1.1 200 OK正しいので、302リダイレクトを送信していないことを確認しました。

問題が何であるか、そしてどうすればこれを修正できるかについて何か考えはありますか?

編集:応答がまだコミットされていないことを確認しました。は、ステータスコードとヘッダーがまだ送信されていないことを意味しますresponse.isCommitted()false

編集2:response.sendRedirect()他の多くの場所で電話をかけてみましたが、の前に正常にリダイレクトできることがわかりました。JSP内のリダイレクトは無視されているようです。また、jspの直後にリダイレクトしようとすると、応答がすでにコミットされているため、不正な状態の例外が発生します。

4

2 に答える 2

12

<jsp:include>カバーの下での使用RequestDispatcher#include()。リンクをクリックして、javadocを表示します。これが関連性の抜粋です(私の強調):

..。

ServletResponseオブジェクトにはパス要素があり、パラメーターは呼び出し元から変更されません。含まれているサーブレットは、応答ステータスコードを変更したり、ヘッダーを設定したりすることはできません。変更を試みても無視されます。

..。

基本的に、HttpServletResponse#sendRedirect()HTTP応答ステータスをターゲットURLに設定し302、HTTPLocationヘッダーをターゲットURLに設定します。したがって、それは完全に無視されています。

より深刻な問題は、JSPをページコントローラー/フィルターとして悪用していることです。実際には、JSPよりはるかに前に実行される通常のサーブレットまたはフィルタクラスを使用する必要があります。

于 2011-07-11T11:22:17.970 に答える
0

リダイレクトヘッダー(私は信じています)はページの上部にある必要があります。参照用にHTML仕様を表示します。

ページの一番上に配置してみましたか?コードサンプルは、デバッグに役立ちます...

于 2011-07-09T22:54:01.330 に答える