36

ユーザー編集セッションを監視する方法が必要です。私が検討しているソリューションの 1 つは、unloadイベントを使用して ajax リクエストを送信し、編集セッションの終了をサーバーに通知することです。(参照:編集の競合を防止するためのユーザー セッションの監視)

イベントに関する私の (かなり限定的な) 読み取りは、unloadこのハンドラーにアタッチされたコードをすばやく実行する必要があることを示しており、通常、メモリ リークを防ぐためにオブジェクトをクリアするために使用されます。

私の質問は、これはこの目的のために十分に確実に機能しますか?

PS。async: falseオプションについては承知しました。

4

5 に答える 5

36

サーバーが応答するのに十分な速さである場合、この方法はかなり信頼できます。しかし、本当に気をつけなければならないことがあります。ブラウザーを閉じてアンロード イベントで AJAX 要求を送信すると、ウィンドウ オブジェクトが破棄される前に応答がサーバーから返されない可能性が非常に高くなります。この場合 (少なくとも IE では)、接続オブジェクトが孤立し、接続タイムアウトになるまで正しく終了しません。サーバーで接続キープアライブがオンになっていない場合、2 つのウィンドウを閉じた後 (別のウィンドウを開いたまま)、サーバーへの開いている接続が不足します (IE6-7 の場合、IE8 - 6 ウィンドウの場合)。接続タイムアウトになるまで、Web サイトを開くことができません。

以前、アンロード時に AJAX リクエストを送信するポップアップ ウィンドウを開いたときに、このような状況に遭遇しました。非常に信頼性が高いのですが、上記の問題に悩まされ、追跡するのに非常に長い時間がかかりました。ダウンし、何が起こっているのかを理解してください。その後、私がしたことは、ウィンドウを開くときにサーバーを呼び出すための同じコードがあることを確認し、アンロードごとにオープナーをチェックし、存在する場合はそこでコードを実行することでした。

最後のブラウザ ウィンドウを閉じると、IE は接続を適切に切断するようですが、別のウィンドウが開いていると切断されません。

PSそして、上記の答えについてコメントするだけで、AJAXは実際には非同期ではありません。少なくともJS実装はそうではありません。リクエストを送信した後も、JS コードはサーバーからの応答を待っています。コードの実行をブロックするわけではありませんが、サーバーが応答するまでに時間がかかる場合があるため (または、Windows が IE ウィンドウ オブジェクトを終了するのに十分な時間)、上記の問題に遭遇する可能性があります。

于 2010-08-29T19:24:18.237 に答える
12

使ってみましたか

var i = new Image(1,1); 
i.src='http://...'

そして、サーバーから空の画像を返すだけです。信頼できるはずだと思います。スクリプトはブロックします。ところで:キャッシングを防ぐためにタイムスタンプを追加するといいです。

于 2010-12-25T18:58:26.097 に答える
3

それが必要なケースがあります。これはサーバー上で大量のメモリを必要とするレポート ページであるため、ユーザーがページを離れたらすぐに解放する必要がありました。フレームセットを作成し、そこにアンロード ハンドラを追加しました。最も信頼できる方法は、イメージの src を解放スクリプトに設定することでした。実際には、ブラウザー間の互換性のために unload と onbeforeunload の両方を使用しました。Web キットのナイトリーでは機能しませんでしたが、管理者はそれで問題ありませんでした。

しかし、それは私が提案した解決策ではありませんでした。より多くの作業を必要としますが、はるかに堅牢なハートビート アプローチを使用します。

ページは定期的にハートビート リクエストを送信する必要があります。各リクエストは、ページからの最後のハートビートを設定します。次に、サーバー上で実行され、最後のハートビートが長すぎる場合にメモリをクリアするスレッドが必要です。

これは、ページを長時間放置するという問題を解決しません。そのためには、ユーザーのアクティビティを監視し、一定期間非アクティブになった後にそのページを離れる必要があります (必ずユーザーに確認してください)。

于 2010-08-27T17:37:28.103 に答える
1

特定のシナリオが にある時間で機能するかどうかについて、独自のテストを行う必要がありますがunload、AJAX は非同期であるため、AJAX 要求の作成は非常に高速です。リクエストを送信するだけで完了です。(ただし、作成したリクエスト オブジェクトをクリアする必要があるかもしれません。)

AJAX リクエストが行われたことを確認したい場合は、さらに心配するか、async:falseオプションを使用する必要があります (この議論が示すように)。しかし、送信するだけでは、カンカンに終わってしまいます。

于 2010-08-27T15:47:50.660 に答える