ASP.NET 会话超时






4.93/5 (38投票s)
本文探讨了警告用户会话超时的方法。
引言
我的项目中的一个需求是警告用户会话即将过期。虽然对于最终用户来说,这似乎是一个简单的需求,但对于开发人员和设计师来说并非如此。我们需要处理实际应用程序中的许多场景。实现这个目标的最佳方法是什么? 一些挑战包括:
- 会话是一个滑动过期值。每次有回发时,它都会被延长。
- 您可以处理此场景的多种方法,每种方法都有其自身的技术挑战。
方法
以下部分将尝试介绍几种处理会话过期的方法。
1. 提供简单的警告
在这种方法中,用户将根据预定义的时间间隔收到简单的警告消息。
<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>
- sessionTimeoutWarning:是应用程序配置中预定义的值。例如 18 分钟。
- sessionTimeout:保存会话超时间隔。例如 20 分钟。如果用户在页面上没有进行大约 18 分钟的回发操作,他将收到有关会话即将过期的警告。
2. 提供简单的警告,然后将用户重定向到主页或登录页
  <script language="javascript" type="text/javascript">
        var sessionTimeoutWarning = 
	"<%= System.Configuration.ConfigurationSettings.AppSettings
	["SessionWarning"].ToString()%>";
        var sessionTimeout = "<%= Session.Timeout %>";
        var timeOnPageLoad = new Date();
 
        //For warning
        setTimeout('SessionWarning()', parseInt(sessionTimeoutWarning) * 60 * 1000);
        //To redirect to the welcome page
        setTimeout('RedirectToWelcomePage()',parseInt(sessionTimeout) * 60 * 1000);
        //Session Warning
        function SessionWarning() {
            //minutes left for expiry
            var minutesForExpiry =  (parseInt(sessionTimeout) - 
				parseInt(sessionTimeoutWarning));
            var message = "Your session will expire in another " + minutesForExpiry + 
			" mins! Please Save the data before the session expires";
            alert(message);
            var currentTime = new Date();
            //time for expiry
            var timeForExpiry = timeOnPageLoad.setMinutes(timeOnPageLoad.getMinutes() 
				+ parseInt(sessionTimeout)); 
            //Current time is greater than the expiry time
            if(Date.parse(currentTime) > timeForExpiry)
            {
                alert("Session expired. You will be redirected to welcome page");
                window.location = "../Welcome.aspx";
            }
        }
        //Session timeout
        function RedirectToWelcomePage(){
            alert("Session expired. You will be redirected to welcome page");
            window.location = "../Welcome.aspx";
        }
  </script>	
在这种方法中,用户将收到有关会话超时的警告。如果用户没有保存或进行任何回发操作,一旦会话间隔时间到期,他将被重定向到登录或主页。
3. 延长用户会话
 <script language="javascript" type="text/javascript">
        var sessionTimeoutWarning = 
	"<%= System.Configuration.ConfigurationSettings.AppSettings
	["SessionWarning"].ToString()%>";
        var sessionTimeout = "<%= Session.Timeout %>";
        var timeOnPageLoad = new Date();
        var sessionWarningTimer = null;
        var redirectToWelcomePageTimer = null;
        //For warning
        var sessionWarningTimer = setTimeout('SessionWarning()', 
				parseInt(sessionTimeoutWarning) * 60 * 1000);
        //To redirect to the welcome page
        var redirectToWelcomePageTimer = setTimeout('RedirectToWelcomePage()',
					parseInt(sessionTimeout) * 60 * 1000);
        //Session Warning
        function SessionWarning() {
            //minutes left for expiry
            var minutesForExpiry =  (parseInt(sessionTimeout) - 
					parseInt(sessionTimeoutWarning));
            var message = "Your session will expire in another " + 
		minutesForExpiry + " mins. Do you want to extend the session?";
            //Confirm the user if he wants to extend the session
            answer = confirm(message);
            //if yes, extend the session.
            if(answer)
            {
                var img = new Image(1, 1);
                img.src = 'KeepAlive.aspx?date=' + escape(new Date());
                //Clear the RedirectToWelcomePage method
                if (redirectToWelcomePageTimer != null) {
                    clearTimeout(redirectToWelcomePageTimer);
                }
   	       //reset the time on page load
                timeOnPageLoad =  new Date();
                sessionWarningTimer = setTimeout('SessionWarning()', 
				parseInt(sessionTimeoutWarning) * 60 * 1000);
                //To redirect to the welcome page
                redirectToWelcomePageTimer = setTimeout
		('RedirectToWelcomePage()',parseInt(sessionTimeout) * 60 * 1000);
            }
            //*************************
            //Even after clicking ok(extending session) or cancel button, 
	   //if the session time is over. Then exit the session.
            var currentTime = new Date();
            //time for expiry
            var timeForExpiry = timeOnPageLoad.setMinutes(timeOnPageLoad.getMinutes() + 
				parseInt(sessionTimeout)); 
            //Current time is greater than the expiry time
            if(Date.parse(currentTime) > timeForExpiry)
            {
                alert("Session expired. You will be redirected to welcome page");
                window.location = "../Welcome.aspx";
            }
            //**************************
        }
        //Session timeout
        function RedirectToWelcomePage(){
            alert("Session expired. You will be redirected to welcome page");
            window.location = "../Welcome.aspx";
        }
</script>   
在这种方法中,用户将收到有关会话超时的警告,并提供延长用户会话的能力。如果用户确认延长会话,则会话将被延长。如果用户在会话过期超时限制后确认,即使如此,用户也将被注销。以下代码行用于延长用户会话。其中 'KeepAlive.aspx' 是网站中的一个虚拟页面。
var img = new Image(1, 1); 
img.src = 'KeepAlive.aspx?date=' + escape(new Date()); 
注意:在上述所有场景中,我假设 SetTimeout 方法和会话相关变量将在每次回发时重置。当可能存在部分渲染并且 SetTimeout 方法和会话相关变量可能未重置时,这可能无法 100% 工作。所有文件都在Samples文件夹中。


