1

正当化と研究

表示するためにユーザーがログインする必要があるサイトがあります。ユーザーがログインしている間、ユーザー セッションを監視したいと思います。つまり、ユーザー セッションの有効期限が切れているかどうかを知りたいので、リダイレクトします。

各ユーザーのセッションは 1 時間 (または私が設定した時間) 続き、別のページにアクセスするとリセットされます (ほとんどのログイン システムと同様)。

現在、次のアルゴリズムがあります。

  1. ユーザーが非公開ページに到達する (呼び出された javascript メソッドisUserAuthorized()が実行される)
  2. isUserAuthorized()JavaScript メソッドは、ページ 'ajax.example.net/authorized' に対して AJAX 要求を行います。
  3. このページは、次のようなユーザーの現在のステータスを示す JSON オブジェクトを返します。

{ authorized: true, timeout: 3600000 }

  1. 次に、javascript メソッドはtimeout、セッションが終了したと仮定して、タイムアウトをミリ秒単位で再度メソッドを呼び出すように設定します。
  2. セッションが終了した場合はユーザーをリダイレクトし、それ以外の場合はtimeoutミリ秒単位でメソッドを呼び出します。

この現在の方法が気に入らない理由は 2 つあります。

  1. クライアントとサーバーのクロック間の時刻同期に問題がありました。これは奇妙ですが、間違いなく問題を引き起こします...
  2. Web ページのバックグラウンドでタイムアウトが発生します。このサイトは JavaScript が非常に多いため、サイトをできるだけスムーズに保つために、この追加のタイムアウトを設定したくありません。

私の質問

したがって、私の質問は、これを達成するためのより良い方法を考えられる人はいますか? 私は長いポーリングまたは Websocket について考えましたが、これらの使用方法を 100% 確信しているわけではなく、Websocket のチュートリアルはあまり良くありません! これらは実際にはより良い解決策でしょうか?

時刻同期の問題を回避できますが、その前に、これを達成するためのより良い方法がないことを確認したいと思います...

それが役立つ場合、これが私の現在のコードです:

// Set the Authorized Timeout
MN.authorizedTimeout = setTimeout(function(){MN.isUserAuthorized});

/**
 * Is User Authorized
 * Checks to see if the current user is authorized and
 * makes sure their session is still active
 */
MN.isUserAuthorized = isUserAuthorized;
function isUserAuthorized(){
    // TEMPORARY
    console.log('authorising');
    // Set the authorized var
    var authorized = false;
    // Clear the current timeout
    clearTimeout(MN.authorizedTimeout);
    // Send request to determine whether the user is authorized
    $.ajax({
        url: "//ajax.example.net/authorized",
        type: "GET",
        dataType: "JSON",
        cache: false,
        async: false,
        success: function(data){
            console.log(data);
            if(data.authorized){
                // If the user is authorized then check again in timeout milliseconds
                MN.authorizedTimeout = setTimeout(MN.isUserAuthorized,data.timeout_milliseconds);
                // Set authorized to true
                authorized = true;
            }else{
                // If the session has expired then proceed to informing the user
                MN.userSessionExpired();
                // Set authorized to false
                authorized = false;
            }
        }
    });
    // Return the session status boolean
    return authorized;
}
4

2 に答える 2

1

更新された回答:

それでも、サーバー側でオンライン ステータスを計算することをお勧めします。そのため、時間に矛盾がないことを確認できます。サーバータイムしかありません。

オンライン ステータスを取得するには、ロング ポーリング アプローチを使用できます。私はあなたに例を作りました:

(function checkLoginStatus(){
    $.ajax({ 
      type: 'POST',
      url: 'loginstatus.php',
      data: {userid : 25},
      success: function(data){
        if(data.logged_in !== true){
          //Log the user out
        }
      }, 
      dataType: "json", 
      complete: checkLoginStatus, 
      timeout: 15000 
    });
})();

これにより、15 秒が経過し、リクエストが完了したときにのみ、新しいリクエストが作成されるようになります。

古い答え:

ログインしているユーザーを監視することが唯一の関心事である場合は、ポーリングする必要はありません。私はすべてをサーバー側に保ちます。users テーブルに「last_active」フィールドを追加するだけです。

ユーザーが対話する (別のサイトにアクセスする) たびに、タイムスタンプを現在のタイムスタンプに更新します。

ユーザーがオンラインかどうかを検出するには、現在のタイムスタンプを取得し、そこから「last_active」タイムスタンプを減算します。差が 1 時間より大きい場合は、ユーザーが非アクティブであることがわかります。

それが私が通常それを処理する方法です。また、AJAX を使用するよりも効率的です (リソースに関して)。

于 2013-05-13T17:11:55.110 に答える
1

全体像を見ると、ユーザーのセッションが期限切れになった瞬間にフロントエンドに警告するサーバー上の何かが必要なように思えます。

ロングポーリングはこれを行うことができます。基本的に、接続を受け入れ、応答を送信する信号を受信するか、接続がタイムアウトするまで接続を保持するバックエンドコントローラーがあります。したがって、フロントエンドには、基本的にリクエストを送信してレスポンスを待つループがあります。応答が空の場合はタイムアウトなので、新しい要求を送信します。応答にコンテンツが含まれている場合は、タイムアウトではなかったため、アクションを実行できます。これで目標が達成され、そのようなシステムの多くはこの方法で構築されています。ただし、HTTP を逆に使用するのは一種のハックであり、クリーンなコードにはなりません。

Websocket は、クライアントとサーバー間の双方向インターフェースです。クライアント側の js は次のようになります。

  function connect(){
    websocket = new WebSocket("wss://yoursite.com:8080");
    //attach event handlers
    websocket.onmessage = onMessage;
  }
  function onMessage(evt){
    // do your thing
  }

に電話すれば、サーバーがクライアントに到達する必要があるときに が対応してくれるのでconnect()安心できます。onMessage()私にとって、サーバーからクライアントにメッセージを送信することがまさに WebSocket を使用する理由であり、WebSocket はその仕事に適したツールです。

于 2013-05-20T23:00:14.297 に答える