2012-05-09 22 views
10

私は、セッションがタイムアウトに達するとポップアップ/レイヤー/アラートを発生させる必要があるasp.netサイトを持っています(10分間)。ポップアップでは、アカウントセッションが非アクティブなために終了し、セッションを続行するためのボタンまたはログアウトのためのボタンが表示されます。ASP.NETのセッションタイムアウト警告

これをオンラインで行う方法はいくつかありますが、これを処理するにはどのような方法が最適ですか?ポップアップがあまりにも長く開いていると、タイムアウトを追加する必要がありますか?

答えて

20

チェックこの記事を、これはあなたが、例えば、これは以前に対処されている

Alert Session Time out in ASP.NET

<script language="javascript" type="text/javascript"> 
     var sessionTimeoutWarning = 
    "<%= System.Configuration.ConfigurationSettings.AppSettings 
    ["SessionWarning"].ToString()%>"; 
     var sessionTimeout = "<%= Session.Timeout %>"; 

     var sTimeout = parseInt(sessionTimeoutWarning) * 60 * 1000; 
     setTimeout('SessionWarning()', sTimeout); 

     function SessionWarning() { 
var message = "Your session will expire in another " + 
    (parseInt(sessionTimeout) - parseInt(sessionTimeoutWarning)) + 
    " mins! Please Save the data before the session expires"; 
alert(message); 
     } 
</script> 
+0

私はこの1つを見てきたええ、私はちょうどTHX – cdub

+0

だ思っていた私は、 '<てsessionStateモード=「は、StateServer」Cookieなし=「false」を追加私のWeb.configファイルでtimeout = "180"> ' 'var sessionTimeoutWarnin'をどうやって割り当てるのですか? – cdub

+0

、何これは実際には非常にうまく機能し、「適切な方法」 – SearchForKnowledge

3

あなたの条件のために必要なものすべてのものが含まれています ASP.NET - Javascript timeOut Warning based on sessionState timeOut in web.config

しかし、私の知る限り、これを行うには、完全に信頼性の高い方法がない、ので、ユーザが同じセッションを使用して複数のウィンドウを開いている場合

  • 、その後、一つのウィンドウには、より最近のかもしれ最も古いウィンドウのクライアントセッションタイムアウトは古い/間違っています。
  • 現在のセッションの有効期限を確認するためにサーバーにラウンドトリップすると、そのセッションの期限が延長され、ポップアップ/アラートの目的が無効になります。
+0

MVC 4のセッションタイムアウトをユーザーに警告する方法を教えてください。また、私はフォーム認証を使用していません。フォーム認証なしで可能ですか? –

0

ここでは、クライアントサイドの技術(javascript)を使用する必要があります。たとえば、javascriptのタイムアウト機能を使用して、警告を表示します。ユーザーが[OK]をクリックすると、セッションを有効に保つために何かをする必要があります。私はjquery.ajaxメソッドを使用してsugestとサーバーへの呼び出しを行う、ダミーの呼び出し - ちょうどセッションを生きていることができます。

0

セッションの開始時間を記録して有効期限を差し引くことで、時間切れをリフレッシュするためにjqueryとsetinterval関数を使ってタイムアウトをリフレッシュすることができます。

0

あなたができることは、メッセージを送信するためにいくつかのJavaScriptを使用することです。特定の期間(アプリケーションでセッションタイムアウトに設定された期間 - 数分)後にタイマーを使用してください。その期間の後、セッションがタイムアウトすることを確認するメッセージボックスをユーザに与えます。ユーザーがクリックしてセションを保持した場合。セッションが失われないように、ページにダミーのポストバックを作成します。また、ユーザーがページ内のフラッシュに直面しないようにコールバックを行うこともできます。

1

以下は、ASP.NETフォーム認証のタイムアウトについてユーザーに警告するjQueryのJavaScriptで、タイムアウトに達するとログインページにリダイレクトされます。これは、セッションタイムアウトに対しても改善され適応される可能性があります。また、ユーザーがクリック、入力、またはサイズ変更してページとやりとりするたびに、サーバーに「ping」することで認証のタイムアウトをリセットします。

これは、クリック、キー押下、サイズ変更のたびにpingを実行することでサーバーに負荷がかかることに注意してください。それでも、多くのユーザーが入力した場合、その影響を評価する必要があります。私はこれを行うための別の方法は考えられませんでした。なぜなら、タイムアウトが過ぎてからサーバーが関与しなければならないからです。

また、タイムアウトはJSでハードコードされていないことに注意してください。それはWeb.configの1つの場所でそれを維持する必要があるので、サーバーからのタイムアウトを取得します。サーバー上で

window.session.monitorAuthenticationTimeout(
     "/Account/Login", // You could also use "@FormsAuthentication.LoginUrl" in Razor. 
     "/Account/Ping"); 

、あなたは残り時間を返すアクションをする必要があります:あなたのページの負荷がとき

(function ($, undefined) { 

    if (!window.session) { 

     window.session = { 

      monitorAuthenticationTimeout: function (redirectUrl, pingUrl, warningDuration, cushion) { 

       // If params not specified, use defaults. 
       redirectUrl = redirectUrl || "~/Account/Login"; 
       pingUrl = pingUrl || "~/Account/Ping"; 
       warningDuration = warningDuration || 45000; 
       cushion = cushion || 4000; 

       var timeoutStartTime, 
        timeout, 
        timer, 
        popup, 
        countdown, 
        pinging; 

       var updateCountDown = function() { 
        var secondsRemaining = Math.floor((timeout - ((new Date()).getTime() - timeoutStartTime))/1000), 
         min = Math.floor(secondsRemaining/60), 
         sec = secondsRemaining % 60; 

        countdown.text((min > 0 ? min + ":" : "") + (sec < 10 ? "0" + sec : sec)); 

        // If timeout hasn't expired, continue countdown. 
        if (secondsRemaining > 0) { 
         timer = window.setTimeout(updateCountDown, 1000); 

        } 
        // Else redirect to login. 
        else { 
         window.location = redirectUrl; 
        } 
       }; 

       var showWarning = function() { 
        if (!popup) { 
         popup = $(
          "<div style=\"text-align:center; padding:2em; color: black; font-color: black; background-color:white; border:2px solid red; position:absolute; left: 50%; top:50%; width:300px; height:120px; margin-left:-150px; margin-top:-90px\">" + 
           "<span style=\"font-size:1.4em; font-weight:bold;\">INACTIVITY ALERT!</span><br/><br/>" + 
           "You will be automatically logged off.<br/><br/>" + 
           "<span style=\"font-size:1.4em; font-weight:bold;\" id=\"countDown\"></span><br/><br/>" + 
           "Click anywhere on the page to continue working." + 
          "</div>") 
          .appendTo($("body")); 

         countdown = popup.find("#countDown"); 
        } 

        popup.show(); 
        updateCountDown(); 
       }; 

       var resetTimeout = function() { 
        // Reset timeout by "pinging" server. 
        if (!pinging) { 
         pinging = true; 
         var pingTime = (new Date()).getTime(); 
         $.ajax({ 
          type: "GET", 
          dataType: "json", 
          url: pingUrl, 
         }).success(function (result) { 

          // Stop countdown. 
          window.clearTimeout(timer); 
          if (popup) { 
           popup.hide(); 
          } 

          // Subract time it took to do the ping from 
          // the returned timeout and a little bit of 
          // cushion so that client will be logged out 
          // just before timeout has expired. 
          timeoutStartTime = (new Date()).getTime(); 
          timeout = result.timeout - (timeoutStartTime - pingTime) - cushion; 

          // Start warning timer. 
          timer = window.setTimeout(showWarning, timeout - warningDuration); 
          pinging = false; 
         }); 
        } 
       }; 

       // If user interacts with browser, reset timeout. 
       $(document).on("mousedown mouseup keydown keyup", "", resetTimeout); 
       $(window).resize(resetTimeout); 

       // Start fresh by reseting timeout. 
       resetTimeout(); 
      }, 
     }; 
    } 

})(jQuery); 

は、単に一度上記を呼び出します。さらに情報を追加することもできます。

public JsonResult Ping() 
    { 
     return Json(new { 
         timeout = FormsAuthentication.Timeout.TotalMilliseconds 
        }, 
        JsonRequestBehavior.AllowGet); 
    } 
関連する問題