12

ユーザーが自分の Web サイトを 1 つのタブで開いてから、別のタブで開いているかどうかを検出しようとしています。これにより、新しく開いたタブでユーザーに警告が表示されます。

現在、「キープアライブ」ajax呼び出しを毎秒サーバーに送信しています。これにより、一意の ID を使用してデータベースに「最後にアクティブになった」時刻が記録されます。新しいページが読み込まれると、そのユーザー (userID で識別される) が過去 2 秒以内にアクティブであったかどうかがチェックされます。

これは非常に非効率に感じます。また、ユーザーがページを更新したときにもうまく機能しません。(2 秒もかかりません)。より遅い接続を可能にするために、キープアライブ呼び出しよりも 2 秒間のチェックを長くしました。

Q)これは正しい方法ですか、それとももっと簡単な方法はありますか? Gmail と Facebook が似たようなことをするかもしれないと聞きましたが、それを行うサイト機能が見つかりません。


実際のコードは多くの社内関数を使用しているため、一般的な考え方は次のとおりです。

擬似コード:

Page load;
[index] PHP: Save tabsessionid, userid, datecreated, lastactive, phpsessionid into database;
[index] JS: Every second, send tabsessionid to keepalive.php
[keepalive] PHP: Check if another session exists in the last 2 seconds
[keepalive] PHP:        If exists -> Return "-1"; else -> return "1";
[keepalive] PHP: Update tabsessionid's last active time.

ここでいくつかの解決策を試しましたが、古いタブではなく新しいタブに警告することは、待ち時間/時間を抑えるという点で難しい部分のようです.

4

4 に答える 4

3

コンテンツのバージョンは、最初は 1 のままにしておく必要があります。編集を送信するたびにバージョンが上がります。送信された編集にはバージョン番号が含まれている必要があります。これは現在のものと比較され、一致しない場合は編集が拒否されます。また、現在のバージョンを要求する ajax 呼び出しを行い、ユーザーのバージョンが古いことを警告することもできます。

SQL 更新は次のようになります。

UPDATE table SET .... WHERE id = :id AND version = :version

次に、影響を受ける行を確認します。0 の場合は、同時更新がありました。このようにして、競合状態に遭遇することはありません。

于 2013-10-11T12:49:26.517 に答える
1

パラメータを使用してすべてのウィンドウからサーバーにデータ(おそらく単純なHEADリクエスト)を送信し、ユーザーuidとウィンドウID(ページの読み込み時にランダムに生成される)を含め、複数のウィンドウIDを持つ同じuidが存在するかどうかを確認する必要があると思います。

これが唯一の方法だと思われます。

于 2013-10-11T07:58:38.587 に答える
1

あなたの問題が何であれ、それは不適切な解決策だと言えますか?

人々がサイトでマルチタブを実行するのを防ぐための汚い回避策を見つけたとしても、シークレット モードに勝るものはありません。その場合は、そのブラウザのバグ レポートを提出してください。

于 2013-10-11T07:58:59.260 に答える