2011-07-09 5 views
7

私はいくつかの値と、そのようなを確認するために、別のJSPファイルが含まれてJSPファイル、持っている:私はいくつかの必要な値であるか否かを判断するいくつかの条件付きコードを持っているsetup.jspインサイドresponse.sendRedirect()from jsp:includeが無視されていますか?

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

をセッションに設定し、そうでない場合は別のページにリダイレクトします。少なくとも、それは想定されていますが、リダイレクトは無視されているようです。

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

「リダイレクトする」を参照してください。コンソールにログに記録されますが、ページは引き続き表示され、正常にレンダリングされます。私は私のためにヘッダーをカールダンプし、応答がHTTP/1.1 200 OKであることを見たので、間違いなく302リダイレクトを送信していません。

問題が何であるか、どのように修正できますか?

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

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

+1

応答の一部がクライアントに送信され、リダイレクトが無視される可能性があります。リダイレクトは最初に解析する必要があります(ほとんど)。 – Augusto

+0

これははるかに大きなWebアプリケーション構造内に収める必要があるので、リダイレクトを行うコードをいつどこに置くことができるかは、私の手によって結び付けられています。リダイレクトをしようとしているときに応答が既にブラウザに戻ってきているかどうかを確認する方法はありますか? jspにインクルードされているときに何らかのリダイレクトをどのように開始できるかについての提案はありますか? –

+0

私は、リダイレクトを呼び出す場所に単純なout.println()メッセージを追加しました。その出力は、レスポンスの他の出力の前に表示されます。私はその時点でリダイレクトすることを許されるべきではありませんか? –

答えて

11

<jsp:include>は、カバーRequestDispatcher#include()で使用しています。リンクをクリックすると、javadocが表示されます。ここでは関連性(強調鉱山)のエキスです:

...

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

...

HttpServletResponse#sendRedirect()基本的にターゲットURLに302にHTTP応答ステータスとHTTP Locationヘッダを設定します。それは全く無視されている。

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

+0

私は虐待について完全に同意しますが、残念ながら私はいくつかの非常に厳しい境界内に収まる必要があります。上のdocスニペットをありがとう、私は分かりませんでした。 –

+0

ようこそ。 – BalusC

0

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

ページの最上部に配置しましたか?コードサンプルは、私たちのデバッグに役立ちます。

+0

残念ながら、私はクライアントのプライバシーに関する懸念から、コードスニペットの方法ではあまり提供することができません。これは、jsp:includesなどの複数のレベルを持つかなり複雑なサイトです。 –

+0

リダイレクトしようとしているときにステータスコードやその他のヘッダーが送信されていないことが確認されているため、実際にはページの上部に表示されます。 –