1

質問は静かに奇妙に聞こえますが、ここに問題があります。次のコードは完全に機能します。タイマーは 30 分で開始し、マウスの動きが検出されない 1 秒ごとにタイマーがカウントダウンされます。マウスの動きが検出されると、タイマーが 30 分にリセットされ、ページの非アクティブ状態が 25 分経過した時点で、CSS ポップアップに最後の 5 分間のカウントダウンが表示され、30 分でユーザーは自動ログアウトされます。ただし、ユーザーがページを開いたまま別の Web ページをアクティブに表示している場合、ブラウザーによっては、タイマーが遅くなったり、完全に停止したりします。実際には、スクリプトを完全に否定します。スクリプトで通常のカウントダウンを続行し、ページをアクティブに表示していない場合でもユーザーを強制的にページから追い出すことはできますか? それとも、メモリ負荷を軽減するためのこれらのブラウザーの癖ですか?

     var Timing = 0;
     var CounterTime = 0;
     var TimePast = 0;
     var Seconds = 1800;
     var Warn = 1500;
     var MinuteLeft = 30;
     var SecondLeft = 60;
     var StopRefresh = 0;

     function ResponseTime()
     {
          Timing = Timing + 100;
          CounterTime = CounterTime + 100;
          if(Timing % 1000 == 0)
          {
                TimePast = TimePast + 1;
                SecondLeft = SecondLeft - 1;
                if(SecondLeft == 59)
                {
                     MinuteLeft = MinuteLeft-1; 
                }
                if(SecondLeft == 0)
                {
                     SecondLeft = 60;
                }
          }
          if(MinuteLeft != 0)
          {
                if(SecondLeft == 60)
                {
                      document.getElementById('CountdownTimer').firstChild.nodeValue = MinuteLeft+":00";
                }else if(SecondLeft < 10)
                {
                      document.getElementById('CountdownTimer').firstChild.nodeValue = MinuteLeft+":0"+SecondLeft;
                }else
                {
                      document.getElementById('CountdownTimer').firstChild.nodeValue = MinuteLeft+":"+SecondLeft;
                }
                if((MinuteLeft == 0) && (SecondLeft <= 10))
                {
                      document.getElementById('CountdownTimer').style.fontWeight = "bolder";
                      document.getElementById('CountdownTimer').style.color = "red";
                }
                      document.getElementById('CountdownTimer').style.fontWeight = "normal";
                      document.getElementById('CountdownTimer').style.color = "black";
                }else
                {
                      document.getElementById('CountdownTimer').firstChild.nodeValue = SecondLeft;
                if((MinuteLeft == 0) && (SecondLeft <= 10))
                {
                      document.getElementById('CountdownTimer').style.fontWeight = "bolder";
                      document.getElementById('CountdownTimer').style.color = "red";
                }else
                {
                      document.getElementById('CountdownTimer').style.fontWeight = "normal";
                      document.getElementById('CountdownTimer').style.color = "black";          
                }
          }
          if(TimePast == 1800)
          {
                 document.getElementById('DoLogoutRequest').submit();   
          }
          if(MinuteLeft <=4)
          {
                 document.getElementById('Overlay').style.visibility="visible";
                 document.getElementById('ForceLogout').style.visibility="visible";
          }else
          {
                 document.getElementById('Overlay').style.visibility="hidden";
                 document.getElementById('ForceLogout').style.visibility="hidden";  
          }
          $(document).ready(function(){
                 $(document).mousemove(function(){
                        Timing = 0;
                        TimePast = 0;
                        SecondLeft = 60;
                        MinuteLeft = 29;
                 });
           });
      }
4

1 に答える 1

0

できることは、スクリプトを変更して、mousemove が検出されたときに、最後の mousemove イベントからの現在の秒数を (Date オブジェクトを使用して) 最初に確認することです。

30 分を超えている場合は、その個人をログアウトする必要があることがわかり、すぐにそのアクションを実行できます。

これは、30 秒の時点で武装しているが、誰かがトリップするまで発火しないトリップワイヤーを設定するようなものだと考えてください。

ただし、そうは言っても、この方法論がどれほど安全であるかについて、私は本当に強い懸念を持っています. 一般に、クライアント側のコードは安全ではありません。ユーザーの自動ログアウトなどは、実際にはセッションを使用してサーバー側で処理する必要があります。

それでも、このアプローチは、別のページに移動する必要がないという点で創造的です。したがって、サーバー側のアプローチとマウスイベントのアプローチを組み合わせて使用​​できる別の手法は、マウスの動きと時間を変数に格納することです。次に、29:30 分の時点で、過去 25 分間に発生したマウスの動きが配列に含まれている場合は、サーバーに対して安全な AJAX 要求を行い、ユーザーがまだアクティブであることをセッションに伝えます。

これにより、必要なときにのみ更新を行うため、サーバーの負荷が軽減されます。また、ユーザーはログアウトを防ぐために更新する必要なくアプリケーションを使用できるようになり、実際の「ユーザーはログイン」は、サーバー上の、それが属するロジックの一部です。サーバーがクライアントからの応答を受信しない場合、サーバーはユーザーをログアウトします。

要約すると、サーバーがユーザーをログアウトしても問題ないことを聞くのを永遠に待機する代わりに、次のようにします。

      if(TimePast == 1800)
      {
             document.getElementById('DoLogoutRequest').submit();   
      }

クライアントのチェックインが聞こえない場合、サーバーはあなたなしで先に進むために、より権威のあるアプローチを取っています。

      if(TimePast <= 1800 && TimePast >= 1700)
      {
             // send keepalive request to the server to prevent auto-logout

      }
于 2012-05-19T19:42:30.493 に答える