2009-04-02 1 views
0

私にはわかりませんが、IllegalStateExceptionが原因で元に戻すことができないと感じています。 JSPやその他のサーブレットをリクエストした場合、そのリクエストにフィルタを関連付ける必要があります。応答がすでにコミットされていれば、クライアントへの出力を変更することはできません。Java/Servlet WebスタックでIllegalStateExceptionを回避する

たとえば、mimetypeをresponse.setContent( "html")に設定した後、MIMEタイプを elseに設定する必要があるJSPに関連するフィルタがあります。 setContent( "image")または "xhtml"。しかし、私はIllegalStateExceptionを取得しますか?

コミットされた以前の応答をクリアする方法や、この問題を回避する方法がありますか?

これはwebsphereにあります。

答えて

2

回答を準備し返す方法を再考する必要があると思います。レスポンスに書き込むことはできません(クライアントに書き込むことができます)。

戻り値の型を変更する必要がある理由を除いて、返される日付+型のダミーコンテナオブジェクトに書き込んで、この変数を変更します。サーブレットがすべての作業を完了した後で、このオブジェクト(type + content)を出力ストリームに書き込みます。

(明確にするため、私は彼らが要求を傍受します。サーブレットフィルタは、このための適切なアプローチだと思う、と応答が、応答人口はサーブレットの責任ですしていない)

+0

これは問題ありませんが、J2EEの世界では、応答が変更される可能性が非常に高いです。基本的に私は出力のMIMEタイプなどを変更することは不可能です。 –

+0

ここでは、摩擦(または検討する質問)です。どの時点で出力がクライアント(ブラウザ)に書き込まれますか。一度それが得られれば、戻ってくることはありません:-)最終的には、レスポンスオブジェクトは属性などを変更させません。 –

+0

あなたはJSPを持っているとします。そのjspにフィルタがあります。フィルタの機能によっては、response.sendRedirectを実行する可能性があります。 Websphere 5.1では、明らかにJSPはデフォルトで既にrespをコミットしてmimetypeを設定しています。もしsendRedierctの上にIllegalStateがある場合は、 –

0

あなたの前提にHTMLを出力するjspを実行してから、コンテンツタイプを他の何かに変更するフィルターを持たせてください。同じレスポンス内のimageはすべて理にかなっていません。レスポンスは、HTMLファイルまたは画像の場合に限り、単一のアーチファクトを返すことができます。同じ応答の中で両方を返す方法はありません。そうしようとする試みはナンセンスです。最後に画像バイナリを貼り付けたHTMLを送るのは意味がありません。コンテンツタイプは応答全体に対するものです。 1つのレスポンスに複数のものをパッケージ化することはできません。

出力がbuffersizeを超えていない場合は、resetBuffer()を使用できます。最良の方法は、この機能を回避し、応答を出力する前に何をするかを決めることです。

+0

これはまさに私がやっていることです。私は入力HTML文書を取得し、その文書を画像に出力するために、解析ツールを画像化するHTMLを使用しています。一部のサービスでは機能しますが、一部のサービスでは機能しません。 https://xhtmlrenderer.dev.java。net/ –

1

これは醜いが、出力をハイジャックするフィルタにHttpServletResponseWrapperを作成することができます元の応答オブジェクトの代わりにそのラッパーをチェーンに渡します。

+0

私はそれをやっています、そして、それは私がエラーを得るところです。フィルターチェーンの最初のどこかで、もし私がmimetypeを設定していれば、チェーンの終わりまでそれを変更することはできません。 –

+0

それでは、あなたはsetContentTypeをハイジャックする必要があると思います –

関連する問題