2017-04-26 7 views
0

私はasp.net mvcアプリケーションを持っています。ユーザーが20分間アイドル状態になると、自動的にログアウトします。 また、ユーザーがブラウザ上でマウスを動かしている場合は、セッションタイムアウトを保持したいと考えています。 はこのために私はjquery mvcアプリケーションで非アクティブな場合、ホームページに強制的にリダイレクトする方法

<body onload="StartTimers();" onmousemove="ResetTimers();"> 
</body> 
<script type="text/javascript"> 

    var timoutNow = @Session.Timeout*60000; // Timeout in 2 mins. 

     var timeoutTimer; 

     // Start timers. 
     function StartTimers() { 
     // warningTimer = setTimeout("IdleWarning()", timoutWarning); 
      setTimeout("IdleTimeout()", timoutNow); 
      $.get("@Url.Action("ResetSession", "Home")", function() { 
       // debugger 
       timoutNow = @Session.Timeout*60000; // Timeout in 2 mins. 
       // debugger 

       setTimeout("IdleTimeout()", timoutNow); 
      });   
     } 

     // Reset timers. 
     function ResetTimers() { 

      clearTimeout(timeoutTimer); 
      StartTimers(); 

     } 


     // Logout the user. 
     function IdleTimeout() { 

       window.location =path + "/Home/Logout" + window.location.search; 

     } 
</script> 

サーバ側としてのコードを書いていた:

public void ResetSession() 
     { 

      Session.Timeout = 1; 

     } 

しかし、問題は、ユーザーが継続的にブラウザでマウスを移動しても、それは後に与えられた時間をログアウトするリダイレクトということです。

+0

setTimeoutをtimeoutTimerに割り当てる必要があります。それ以外の場合、clearTimeout(timeoutTimer)は実際に何もしません。 'timeoutTimer = setTimeout(" IdleTimeout() "、timoutNow);' – noriMonsta

答えて

0

これは、ウィンドウにイベントを定義していないためです。あなたのコードにこれを追加します。

<body onload="StartTimers();" onmousemove="ResetTimers();"> 
 
</body> 
 
<script type="text/javascript"> 
 

 
    var timoutNow = @Session.Timeout*60000; // Timeout in 2 mins. 
 

 
     var timeoutTimer; 
 

 
     // Start timers. 
 
     function StartTimers() { 
 
     // warningTimer = setTimeout("IdleWarning()", timoutWarning); 
 
      setTimeout("IdleTimeout()", timoutNow); 
 
      $.get("@Url.Action("ResetSession", "Home")", function() { 
 
       // debugger 
 
       timoutNow = @Session.Timeout*60000; // Timeout in 2 mins. 
 
       // debugger 
 

 
       setTimeout("IdleTimeout()", timoutNow); 
 
      });   
 
     } 
 

 
     // Reset timers. 
 
     function ResetTimers() { 
 

 
      clearTimeout(timeoutTimer); 
 
      StartTimers(); 
 

 
     } 
 

 

 
     // Logout the user. 
 
     function IdleTimeout() { 
 

 
       window.location =path + "/Home/Logout" + window.location.search; 
 

 
     } 
 
     /// define keyup and mousemove here: 
 
     $(document).keyup(function(){ 
 
      ResetTimers(); 
 
     }).mousemove(function(){ 
 
      ResetTimers(); 
 
     }); 
 
</script>

+0

私は – user1681166

0

いくつかは、ここでの注意する:

  1. セッションタイムアウトがスライドしています。サーバーとのユーザーの対話は、セッションのタイムアウトを防ぎます。言い換えれば、サーバーに要求するだけです。そのリクエストでセッションタイムアウトを明示的に変更する必要はありません。

  2. 認証タイムアウトは絶対的です。認証設定では、認証を有効にする時間をカスタマイズすることができます。その時間が経過するかデフォルト値に達すると、サイトを積極的に使用しているかどうかに関係なく、ユーザーは認証解除されます。

  3. セッションと認証の両方はクッキーベースです。つまり、クライアント側のコンポーネントがあります。サーバーは、ユーザーのマシン上でセッションまたは認証を直接無効にすることはできません。サーバー上のものだけを無効にすることができます。つまり、クライアントは新しい要求を行うまで影響を受けません。その時点でのみクッキーが無効になり、新しいセッションが割り当てられるか、再認証が求められます。あなたは何かなどを行いたい場合は、その認証の有効期限が切れたとき、あなたはこれを追跡するためのクライアント側のタイマーを設定する必要がありますすぐログインページにユーザーをリダイレクトする、ということを考えると

。クライアント側のタイマーが期限切れになると、location.href経由でクライアント側のリダイレクトを手動でログインページに行うことができます。また、この時点までにユーザーの認証が実際に失効してしまったため、無駄になります。トリッキーな部分は、この特定のタイマーをページビュー全体に保持する必要があることです。これは絶対的なものです。言い換えれば、ユーザーが1ページで10分を費やし、20分後に認証が失効すると、次のページビューのタイマーは10分後に開始する必要があります。このためにlocalStorageを使用する可能性があります。また、認証のタイムアウトは絶対的なものであるため、ユーザーがサイトを積極的に利用していることから、それをキャンセルする方法はありません。そのようなことをする必要がある場合は、authタイムアウトを無理に大きな値に設定する必要があります。そのため、ユーザーの認証はWebサイトを1回訪れても有効期限切れになりません。次に、ユーザーがアイドル状態の場合、クライアント側のタイマーを使用してサインアウトアクションにAJAX要求を送信できます。

セッションタイムアウトをリセットするために必要なAJAXは、セッションタイムアウトをリセットするのに十分です.AJAX経由でリクエストを送るだけで十分です。しかし、あなたは現在、AJAX を毎回マウスを動かすように送信しています。つまり、効果的にあなたのサーバーをスパムしています。これを大幅に抑制して、新しいAJAXリクエストが数分で送信されない場合にのみmousemoveで送信されるようにしてください。セッションがタイムアウトする前に少なくとも1つのリクエストを送信する限り、実質的にタイムアウトしないため、ほとんどの場合、毎秒または毎分のリクエストを送信する必要はありません。

関連する問題