我是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");
答案 0 :(得分:1)
因此,您的策略对我来说没问题,但我更喜欢不同的实现:
IsRefreshHeaderNeeded
- 默认实现将返回true。该方法将在BasePage的PreRender阶段中调用,以便在响应中添加实际的刷新头。IsRefreshHeaderNeeded
以返回false。 (在登录页面或不需要会话支持的页面中可能需要类似。)母版页是一个内容模板,我更喜欢在母版页中只有与该内容相关的逻辑。
另一种策略是不使用客户端刷新会话到期,而是在用户访问网站时指示当前会话已过期时从服务器端执行此操作。进一步扩展,您甚至可以实现将关键会话数据保存到数据库中以便您可以重建会话,从用户体验的角度来看,将没有会话到期。
答案 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");