如何在母版页或global.asax中启动时检查会话

时间:2011-01-12 06:26:17

标签: c# asp.net session session-timeout

我是asp.net表单身份验证和会话的新手

我想知道如何在masterpage或global.asax中保存会话 以及如何清除会话

如何通过重定向到页面来更好地处理会话超时

这是我的web.config会话设置

<sessionState mode="InProc" cookieless="false" timeout="1"></sessionState>

我的母版页中的代码

 if (Request.Url.AbsolutePath.EndsWith("SessionExpired.aspx", StringComparison.InvariantCultureIgnoreCase))
    {
        HtmlMeta meta = new HtmlMeta();
        meta.HttpEquiv = "Refresh";
        meta.Content = "7; URL=./Login.aspx";
        Page.Header.Controls.Add(meta);
    }
    else
        HttpContext.Current.Response.AppendHeader("Refresh", Convert.ToString((Session.Timeout * 60)) + "; Url=./Public/SessionExpired.aspx");

2 个答案:

答案 0 :(得分:1)

因此,您的策略对我来说没问题,但我更喜欢不同的实现:

  1. 使用从System.Web.UI.Page派生的抽象类作为所有页面的基类。假设我们将此类称为BasePage。
  2. 添加虚拟方法,例如IsRefreshHeaderNeeded - 默认实现将返回true。该方法将在BasePage的PreRender阶段中调用,以便在响应中添加实际的刷新头。
  3. 在SessionExpired页面中,将覆盖IsRefreshHeaderNeeded以返回false。 (在登录页面或不需要会话支持的页面中可能需要类似。)
  4. 刷新标题/元以重定向到登录页面将添加到SessionExpired页面本身(实际上它是页面中的逻辑,为什么要将它放在全局位置)。 SessionExpired页面当然会有用于手动导航到登录页面的链接(如果重定向不起作用)。
  5. 母版页是一个内容模板,我更喜欢在母版页中只有与该内容相关的逻辑。

    另一种策略是不使用客户端刷新会话到期,而是在用户访问网站时指示当前会话已过期时从服务器端执行此操作。进一步扩展,您甚至可以实现将关键会话数据保存到数据库中以便您可以重建会话,从用户体验的角度来看,将没有会话到期。

答案 1 :(得分:1)

您可以通过调用

手动清除会话
   Session.Abandon();
   System.Web.Security.FormsAuthentication.RedirectToLoginPage();

关于会话到期日期: 在某处执行此代码(如VinayC建议,MasterPage或从System.Web.UI.Page派生的类,作为所有内容页面的基类(意味着在所有代码隐藏中更改System.Web.UI.Page的派生)从aspx页面到自定义类派生的文件)

 if (Request.Url.AbsolutePath.EndsWith("SessionExpired.aspx", StringComparison.InvariantCultureIgnoreCase))
    {
        // your html redirect code here
    }
    else
        Response.Redirect("~/Public/SessionExpired.aspx");