-1

重複の可能性:
時間指定の自動ログアウトとブラウザの終了

Web サイトのユーザー使用状況を mysql テーブルに保存しています。ログイン時に挿入クエリを使用してログイン時間をキャプチャして保存できます。また、ユーザーがログアウトを選択した場合もログアウト時間をキャプチャしています。ログアウトボタン。

しかし、ユーザーがブラウザを閉じただけで、ログアウト時にクエリを起動するにはどうすればよいでしょうか。

私が今まで得たのはこれですが、これでセッションタイムアウトの問題に対処できますが、「ブラウザを閉じる」ことはできません

if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) 

   {

    // last request was more than 30 minates ago
      session_unset();     // unset $_SESSION variable for the runtime 
      session_destroy();   // destroy session data in storage

   }

  $_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp

これを解決するのを手伝ってください..

4

5 に答える 5

4

ユーザーがブラウザーを閉じたり、サイトから別の場所に移動したことを確実に知る方法はありません。これは、コンテンツがダウンロードされると、サーバーとサイト間の接続がなくなることを意味する HTTP のステートレスな性質によるものです。ブラウザー (ほとんどの場合)。

ajax リクエストを使用してサーバーを「ping」することもできます。その ping が低下すると、サイトへのすべてのページが閉じられたと見なすことができます。これは、無駄にネットワークにトラフィックを追加するため、悪いことです。つまり、サーバーが処理する要求の数が増え、実際には機能が向上しません。

于 2012-10-08T11:53:38.623 に答える
2

beforeunloadブラウザイベントを使用することで、使用するリソースが 1 つ少なくなり、中継プロセスも少なくなります。

ブラウザ イベントでサーバーに ajax リクエストを送信し、 beforeunloadユーザーのログアウト時間を挿入します。

ブラウザウィンドウのクローズイベントをキャプチャする方法に関するSLAKSの素敵な回答は? ** は

このbeforeunloadイベントは、ユーザーが何らかの理由でページを離れるたびに発生します。

たとえば、ユーザーがフォームを送信したり、リンクをクリックしたり、ウィンドウ (またはタブ) を閉じたり、アドレス バー、検索ボックス、またはブックマークを使用して新しいページに移動した場合に発生します。

次のコードを使用して、フォームの送信とハイパーリンク (他のフレームを除く) を除外できます。

var inFormOrLink;
$('a').live('click', function() { inFormOrLink = true; });
$('form').bind('submit', function() { inFormOrLink = true; });

$(window).bind("beforeunload", function() { 
    return inFormOrLink || confirm("Do you really want to close?"); 
})

このliveメソッドはイベントでは機能しないsubmitため、新しいフォームを追加する場合は、ハンドラーもそれにバインドする必要があります。別のイベント ハンドラーが送信またはナビゲーションをキャンセルした場合、後でウィンドウが実際に閉じられると、確認プロンプトが失われることに注意してください。beforeunload送信イベントとクリック イベントの時間を記録し、数秒以上経過してから発生するかどうかを確認することで、これを修正できます。

于 2012-10-08T12:00:44.490 に答える
1

ブラウザの終了を追跡することはできません。タブのポップアップまたはクローズを追跡できます。

に頼ることはできませんbeforeunload。ブラウザには対応していないと思います。

于 2012-10-08T12:28:41.537 に答える
-1

これは私がテストしたものであり、ブラウザを閉じたときに機能しました

session_start();
    if (!isset($_SESSION['LAST_ACTIVITY'])) {
        // initiate value
        $_SESSION['LAST_ACTIVITY'] = time();
    }
    if (time() - $_SESSION['LAST_ACTIVITY'] > 1800) {
        // last activity is more than 10 minutes ago
        session_destroy();
    } else {
        // update last activity timestamp
        $_SESSION['LAST_ACTIVITY'] = time();
    }

ここでは、ユーザーの各アクティビティのタイムスタンプを保存しています。その時間が30分以上前の場合、ログアウト(セッションの破棄)を行っています。

アプリケーションでこれが許可されているかどうかはわかりませんが、私が知る限り、これはこの種のシナリオで達成するために使用した方法です。

コメントを見た後に編集する

ブラウザを閉じてもサーバーへのリクエストはトリガーされないため、ユーザーがブラウザを閉じたことを知る方法はありません。リスナーを使用してセッションをタイムアウトさせ、それが発生したときに現在の時刻を保存することができます

window.onbeforeunloadまたはwindow.onunloadでajax呼び出しを実行することにより、ブラウザーが閉じているときにサーバーと通信できます。

上記の私の解決策では、いくつかのアクティビティの後に時間が経過したときにユーザーを自動的にログアウトすることができます

于 2012-10-08T11:49:44.943 に答える
-2

ユーザーがブラウザを閉じると、セッションはとにかく破棄されます。だからあなたはそれを破壊する必要はありません。

于 2012-10-08T11:47:30.247 に答える