6

Java サーブレットからのダウンロード中にユーザーがキャンセルを押したかどうかをどのように判断できますか? 出力ストリームの println() ブロックである IE で何が起こっているように見えますか。ヒットキャンセルを使いましたが、これをタイムアウトさせる方法などはありますか?

4

2 に答える 2

5

ラップしOutputStream#write()、ブロックで。キャッチされた場合、それは通常、エンドユーザーがリクエストを中止したことを意味します。#flush()#close()try-catchIOException

さらに一歩進めるために、ClientAbortExceptionTomcatやクローン(のサブクラスIOException)のような、よりservletcontainer固有の例外をキャッチすることもできますが、これにより、Webアプリケーションコードが他のservletcontainerに移植できなくなります。


更新:ブロッキングの問題に戻るにはflush()、データの単一ブロックを書き込んだ後に呼び出します。これにより、実際にデータがクライアントに送信されIOException、基になるソケットが閉じられたときに発生します。

于 2010-09-09T18:07:49.470 に答える
2

あなたは確かに言うことができないでしょう. サーブレット コンテナの実装方法によって異なります。

ユーザーが「キャンセル」を押すと、ブラウザはソケットを閉じる必要があります。もちろん、これはサーバーによって検出可能ですが、サーバーがServletOutputStreamソケットに直接「配管」されているかどうかOutputStreamは実装に依存します。その場合IOException、次にサーブレットがデータを書き込もうとしたときに が発生します。

コンテナが出力をバッファリングする場合、サーブレットはデータの書き込みを終了しただけで、何か問題が発生したことをまったく認識していない可能性があります。

于 2010-09-09T18:12:22.047 に答える