Java サーブレットからのダウンロード中にユーザーがキャンセルを押したかどうかをどのように判断できますか? 出力ストリームの println() ブロックである IE で何が起こっているように見えますか。ヒットキャンセルを使いましたが、これをタイムアウトさせる方法などはありますか?
2 に答える
ラップしOutputStream#write()
、ブロックで。キャッチされた場合、それは通常、エンドユーザーがリクエストを中止したことを意味します。#flush()
#close()
try-catch
IOException
さらに一歩進めるために、ClientAbortException
Tomcatやクローン(のサブクラスIOException
)のような、よりservletcontainer固有の例外をキャッチすることもできますが、これにより、Webアプリケーションコードが他のservletcontainerに移植できなくなります。
更新:ブロッキングの問題に戻るにはflush()
、データの単一ブロックを書き込んだ後に呼び出します。これにより、実際にデータがクライアントに送信されIOException
、基になるソケットが閉じられたときに発生します。
あなたは確かに言うことができないでしょう. サーブレット コンテナの実装方法によって異なります。
ユーザーが「キャンセル」を押すと、ブラウザはソケットを閉じる必要があります。もちろん、これはサーバーによって検出可能ですが、サーバーがServletOutputStream
ソケットに直接「配管」されているかどうかOutputStream
は実装に依存します。その場合IOException
、次にサーブレットがデータを書き込もうとしたときに が発生します。
コンテナが出力をバッファリングする場合、サーブレットはデータの書き込みを終了しただけで、何か問題が発生したことをまったく認識していない可能性があります。