2012-05-09 86 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

是的,我一直在看这一个,我只是想知道这是什么实际效果很好的“有道” – cdub

+0

,THX – cdub

+0

我加'<的sessionState模式=“StateServer的”无Cookie =“假” timeout =“180”>'在我的Web.config文件中。我如何分配'var sessionTimeoutWarnin'? – SearchForKnowledge

3

此之前已经解决,例如,所有的东西 ASP.NET - Javascript timeOut Warning based on sessionState timeOut in web.config

不过,据我所知没有这样做一个完全可靠的方法,因为:

  • 如果用户使用同一个会话有多个窗口打开,然后一个窗口可能会更近比另一个和最老的窗口上的客户端会话超时将陈旧/不正确。
  • 如果往返服务器以查看当前会话过期是什么,则会扩展它,从而破坏弹出/警报的用途。
+0

你能告诉我,如何提醒用户在MVC 4中的会话超时?另外我没有使用表单身份验证。没有表单身份验证可能吗? –

0

你必须在这里使用客户端技术(javascript)。使用例如,你会使用JavaScript超时设施,然后显示警告。如果用户单击确定,则可能需要执行一些操作才能保持会话的活跃。我会使用jquery.ajax方法进行提示,并调用服务器,这可能是一个虚拟调用 - 只是为了保持会话的活跃。

0

你可以让jquery和setinterval函数在后台做一个Ajax post来刷新超时,如果使用滑动过期,或者通过记录会话开始时间和从过期时间减去时间来获得时间剩余值。

0

你可以做的就是使用一些JavaScript来激发消息。使用计时器在一段时间后停止(在应用程序中为会话超时设置的时间段 - 几分钟)之后,给用户一个确认消息框,表示会话超时。如果用户点击以保留该会话。在页面中做一个假回传,这样会话不会丢失。您还可以拨打回电,以便用户不会在页面中遇到闪光灯。

1

下面是一些JavaScript的jQuery警告用户有关ASP.NET窗体身份验证超时,并将重定向到登录页面,如果超时已达到。它可以被改进并适用于会话超时。当用户通过单击,键入或调整大小与用户交互时,它也会通过“ping”服务器来重置认证超时。

请注意,这确实通过每次点击,按键,调整大小来增加负载到服务器,但它是非常小的。不过,如果你有很多用户打字,你需要评估影响。我想不出另一种方式来做到这一点,因为服务器必须参与,因为这是超时过期的地方。

另请注意,超时并未在JS中进行硬编码。它从服务器获取超时值,因此您只需要将其保存在Web.config中的一个位置。

(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); 

只需拨打以上,一旦当你的页面加载:

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

在服务器上,你需要返回剩余时间的操作。您也可以添加更多信息。

public JsonResult Ping() 
    { 
     return Json(new { 
         timeout = FormsAuthentication.Timeout.TotalMilliseconds 
        }, 
        JsonRequestBehavior.AllowGet); 
    }