ユーザーの編集セッションを監視する方法が必要です。検討している解決策の1つは、unload
イベントを使用してajaxリクエストを送信し、編集セッションの終了をサーバーに通知することです。 (参照: 編集の競合を防ぐためのユーザーセッションの監視 )
unload
イベントの私の(かなり制限された)読み取りは、このハンドラーにアタッチされたコードをすばやく実行する必要があることを示しており、通常、オブジェクトをクリアしてメモリリークを防ぐために使用されます。
私の質問は、これはこの目的のために十分に確実に機能できるかということです。
PS。 async: false
オプションについて知っています。
サーバーが応答するのに十分な速さであれば、この方法はかなり信頼できます。でも本当に気をつけるべきこと。ブラウザーを閉じて、アンロードイベントでAJAX=リクエストを送信した場合、ウィンドウオブジェクトが破棄される前に、サーバーから応答が返されない可能性が非常に高くなります。この場合(少なくともIEでは)、接続オブジェクトが孤立し、接続タイムアウトになるまで正しく終了しません。サーバーで接続キープアライブがオンになっていない場合は、2つのウィンドウを閉じた後(別のウィンドウを開いている間は)サーバーへの開いている接続が不足し(IE6-7の場合、IE8-6ウィンドウの場合)、接続タイムアウトに達するまでWebサイトを開くことができません。
アンロード時にAJAXリクエストを送信しているポップアップウィンドウを開いていたとき、そのような状況に遭遇しました。非常に信頼できましたが、上記の発行に悩まされていました。私がそれを追跡し、何が起こっているのかを理解するのに本当に長い時間がかかりました。その後、私がしたことは、開いているウィンドウにサーバーを呼び出す同じコードがあり、すべてのアンロードでオープナーをチェックして実行したことを確認しました存在する場合はそこにコードを記述します。
最後のブラウザウィンドウを閉じると、IEは接続を適切に破壊しますが、他のウィンドウが開いている場合はそうではありません。
追伸上記の答えにコメントするだけで、AJAXは実際には非同期ではありません。少なくともそれのJS実装は非同期ではありません。リクエストを送信した後も、JSコードはまだ待機しています。サーバーからの応答です。コードの実行がブロックされることはありませんが、サーバーが応答するまでに時間がかかる場合がある(またはWindowsが終了するのに十分長いIEウィンドウオブジェクト)場合があります。上記の問題が発生します。
使ってみましたか
var i = new Image(1,1);
i.src='http://...'
サーバーから空の画像を返すだけです。信頼できるはずです。スクリプトはブロックします。ところで:キャッシングを防ぐためにタイムスタンプを追加すると便利です。
それが必要な場合があります。これは、サーバーに深刻なメモリを必要とするレポートページなので、ページを離れたらすぐに解放したいと考えていました。フレームセットを作成し、そこにアンロードハンドラーを追加しました。最も信頼できる方法は、画像のsrcを解放スクリプトに設定することでした。ブラウザ間の互換性のために、実際にはアンロードとonbeforeunloadの両方を使用しました。 Webキットのナイトリーでは機能しませんでしたが、管理はそれで問題ありませんでした。
しかし、それは私の提案した解決策ではありませんでした。私はより多くの作業を伴うがはるかに堅牢なハートビートアプローチを使用します。
ページは定期的なハートビート要求を送信する必要があります。各リクエストは、ページからの最後のハートビートを設定します。次に、サーバー上で実行され、最後のハートビートが古すぎる場合はメモリをクリアするスレッドが必要です。
これは、ページを長い間残しておく問題を解決しません。そのためには、ユーザーアクティビティの監視が必要であり、一定期間非アクティブになってからそのページを離れます(必ずユーザーに確認してください)。
特定のシナリオがunload
にある時間で機能するかどうかについて、独自のテストを行う必要がありますが、AJAXリクエストを行うと、 AJAXは非同期です。リクエストを送信するだけで完了です!(ただし、作成したばかりのリクエストオブジェクトをクリアする必要があるかもしれません。)
AJAXリクエストがそれを行ったことを確認したい場合は、もっと心配する必要があります/ async:false
オプション( この説明 のように)。しかし、送信するだけですぐにブームになり、操作は完了です。