3

クライアントからの HTTP GET リクエストを処理する Java サーブレットがあります。リクエストを処理した後、HTTP 200 OK を返し、レスポンスには数百バイトのデータが含まれます。

応答が送信されるのとほぼ同時にクライアントがネットワークから切断される特定のエラー状態があります。データはサーブレットによって出力ストリームに書き込まれ、出力ストリームがフラッシュされます。タイミングは、出力ストリームがフラッシュされた時点で、サーバーはクライアントが接続されていないことを認識していません。(クライアントとサーバーの間のポイントによって接続が突然切断されたため、クライアントは TCP 接続を適切に閉じる機会がありません。サーバーは TCP RST を認識しません。)

問題は、サーブレットがこの状態を検出する方法があるかどうかです。私はすでに2つのことを確認しました:

  1. サーブレットで例外がスローされません。この状態で IOException が発生することを期待していましたが、発生していないようです。
  2. クライアントへの書き込みに使用されている PrintWriter で PrintWriter.checkError() を呼び出すと、このエラー状態が発生した場合でも false (エラーなし) が返されます。

したがって、私が知る限り、サーバーがこれを知る方法はありません。しかし、クライアントの TCP スタックからの確認応答がないことに基づいて、それが可能であるように思えます。しかし、おそらくこれはサーブレットに公開されていません。

問題があるかどうかはわかりませんが、Tomcat 7.0.26 を使用しています。

4

1 に答える 1

0

できません。応答はコンテナによって完全にバッファリングされ、サーブレット コードが終了した後にのみ書き込まれる場合があります。

アプリケーションへの応答を受信するクライアントへの依存を構築してはなりません。これは冪等性と呼ばれます。調べてください。

于 2013-04-22T23:20:17.787 に答える