【问题标题】:Session End in ASP.net MVCASP.net MVC 中的会话结束
【发布时间】:2009-05-13 17:32:18
【问题描述】:

我将用户数据放在会话中,然后将其传递给 viewdata 以在页面上查看。现在,当我的用户离开他的计算机一段时间后,会话结束并且他输入的数据丢失了。(没关系)问题是当他返回时,他刷新了我的页面仍在显示的屏幕,但所有数据都是走了。所以,

当会话到期时,我如何将用户重定向到登录屏幕(这样他就看不到空白页面),或者我想将他重定向到显示“您因不活动而退出”的页面。

谢谢

【问题讨论】:

    标签: .net asp.net-mvc


    【解决方案1】:

    我在我的 MasterPage 中使用一些 Javascript 将用户(在提示更新会话后)重定向到注销操作。当用户单击对话框中的按钮以扩展会话时,它使用返回应用程序主页的 AJAX 请求来刷新服务器端会话窗口。对话框依赖 jQuery 和 jQuery UI。

     <% if (this.Request.IsAuthenticated)
        {
            int sessionDialogWait = 2 * 60 * 1000 - 60 * 500; // ms = 1.5 minutes
            int sessionTimeout = 28 * 60 * 1000; // ms = 28 minutes
            if (ViewData["sessionTimeout"] != null)
            {
                sessionTimeout = ((int)ViewData["sessionTimeout"] * 60 - 120) * 1000;
            }
    %>  
    <script type="text/javascript">
        var logoutTimer = null;
        var sessionTimer = null;
        var sessionTimeout = Number('<%= sessionTimeout %>');
        var sessionDialogWait = Number('<%= sessionDialogWait %>');
    
        $(document).ready( function() {
            $('#sessionEndDialog').dialog( {
                autoOpen: false,
                bgiframe: true,
                modal: true,
                buttons: {
                    OK: function() {
                        $(this).dialog('close');
                        $.get( '<%= Url.Action( "About", "Home" ) %>', scheduleSessionPrompt, 'html' );
                    },
                    Logout: logoutOnSessionExpires
                }
            }).ajaxStart( function() { scheduleSessionPrompt(); } );
            scheduleSessionPrompt();
        });
    
        function scheduleSessionPrompt()
        {
            if (logoutTimer) clearTimeout(logoutTimer);
            if (sessionTimer) clearTimeout(sessionTimer);
    
            sessionTimer = setTimeout( sessionExpiring, sessionTimeout  );
        }
    
        function sessionExpiring()
        {
             logoutTimer = setTimeout( logoutOnSessionExpires, sessionDialogWait );
             $('#sessionEndDialog').dialog('open');
        }
    
        function logoutOnSessionExpires()
        {
            window.location.href = '<%= Url.Action( "Logout", "Account" ) %>';
        }       
    
        </script>
    <% } %>
    
    <div id="sessionEndDialog" title="Session Expiring" style="display: none;">
        <p>Your session is about to expire.  Click OK to renew your session or Logout to logout of the application.</p>
    </div>
    

    【讨论】:

    • Global.asax 中的 Session_End 能适应这个吗?
    • 我看不到如何将浏览器重定向到与 Session_End 事件不同的页面,除非浏览器定期检查会话是否处于活动状态。不幸的是,让浏览器这样做会人为地保持会话处于活动状态,因为它会在每次查询时更新。我正在努力把它变成一个 jQuery 插件。
    • 如果我错了,请纠正我,但 Session_End 在后台线程中运行,因此无法与用户通信。喜欢你的工作 tvanfosson,你的方法效果很好
    【解决方案2】:

    我在使用旧的 ASP.net 应用时遇到了同样的问题。会话到期,但用户仍然通过身份验证,因为会话和身份验证 cookie 不同,不一定同时到期。 我当时所做的是使用 global.asax Session_Start 来检查用户是否已通过身份验证并将其注销。

        protected void Session_Start(Object sender, EventArgs e)
        {
            if (User.Identity.IsAuthenticated)
            {
                FormsAuthentication.SignOut();
                Response.Redirect("~/SessionEnd.aspx");
            }
        }
    

    这会强制启动会话的用户再次登录。您还可以使用此事件从数据库中恢复会话信息,或者将他重定向到另一个页面但保持他的凭据有效。

    【讨论】:

    • 会话超时是网络服务器的功能吗? (IIS6) 只能在控制面板中更改吗?
    • 我试过这段代码,它让我退出,但 Response.Redirect 没有把我带到我的页面。
    • 您可以在 web.config 或以编程方式使用 Session.Timeout = x;如果您退出,则只能进入登录页面或不受身份验证保护的页面。
    【解决方案3】:

    我假设您正在以某种方式对用户进行身份验证,但您使用的是表单身份验证吗?:

    ASP.Net MVC Framework - Using Forms Authentication

    如果您已经在使用表单身份验证,则需要确保身份验证 cookie 过期时间比您的会话超时时间短一点。

    【讨论】:

    • 是的,我使用默认的 MVC 项目作为我的基础。
    • 哇!我讨厌网站总是让我退出。在实施或不实施之前仔细考虑。当然,您网站的性质将是决定因素 :)
    【解决方案4】:

    数据可能仍在页面上,因为浏览器正在缓存它。

    试着把这个扔进去,看看会话结束后数据是否还在:

    <META HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多