1

(関連する質問を参照してください:接続を閉じずに、チャンクされた http 応答の途中でエラーを報告するにはどうすればよいですか? )

私の場合、ブラウザがエラー メッセージを表示することが一番の望みです。どんなに無知でも。

ServletResponse outputStream を閉じることは明らかに機能しません。最初に閉じなくても、例外をスローしません(Tomcat 6.0.16でテスト済み)。私が欲しいのは、RST パケット、チャンクの途中の FIN、または不適切な形式のチャンク ヘッダーのいずれかだと思います。

その後、さまざまなブラウザーがどのように応答するかについて心配することができます。

明確化のために編集: これはファイルのダウンロード用で、おそらく数ギガバイトのバイナリ データです。一部のデータの送信を開始する前に、すべてのデータを正常に読み取ったり復号化したりできるかどうかを確認できません。

4

3 に答える 3

1

調査後の私自身の答え。

パート 1: 私がテストしたアプリケーション サーバーに、「コミット」フェーズを過ぎてネットワークにエラーを送信するよう説得する方法はないようです。次のサーブレット コードは、ソケットに正当な HTTP Chunked Transfer ヘッダーを作成します。興味深いことに、WebSphere の場合、エンド マークの前のストリームの末尾にエラー メッセージが追加されます。

public class Servlet extends HttpServlet {
    public static final int ARRAY_SIZE = 65536;
    private static final int SEND_COUNT = 100000;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException {

        String testData = "This is a fairly long piece of test text, running on and on and on, over and over.";

        final ServletOutputStream outputStream = response.getOutputStream();
        for (int i = 0; i < SEND_COUNT; ++i) {
            outputStream.println(testData);
        }
        throw new ServletException("Break it now");
    }
}

パート 2: アプリケーション サーバーが偽のデータをワイヤに書き込むか、長さ 0 のチャンクを閉じずにソケットを閉じようとしても、一般的なクライアントはエラーを報告しません。IE7、FF3、および cURL は、チャンク エンコーディングのエラーを報告しません。これは HTTP ダウンロードを本質的に信頼できないものにし、HTTP 1.1 RFC の文言ではないにしても精神に反します。

于 2008-10-15T20:07:57.327 に答える
0

私はあなたがそれについて間違った方法で行っていると思います。成功するか失敗するかが確実になるまで、実際にデータの送信を開始しない方が簡単なようです。そうすれば、有効でない部分的なデータを送信する代わりに、必要に応じて最初にエラー メッセージを送信できます。

本当にそうしなければならないのであれば、JavaScript を使って何かをまとめることができるかもしれません。エラーが発生したら、接続を閉じる前に次のように出力します。

<script type="text/javascript"> alert("Processing failed!"); </script>

スクリプトを拡張する必要があるかもしれませんが、一般的なアイデアは理解できます。これは、ブラウザに送り返されているのは HTML ページであると想定していますが、質問ではそれを指定していません。

于 2008-10-09T21:29:04.137 に答える
0

サーブレット API では許可されていません。応答がコミットされると、応答コードが送信されます。最善の方法は、接続を閉じてエラーをログに記録することです。

于 2008-10-15T20:18:07.553 に答える