如何在asp.net中单击浏览器后退按钮使会话到期

时间:2014-01-30 12:28:56

标签: asp.net asp.net-mvc-4

这是我的情景:

我有以下几页:

  • 1登录页面
  • 1主页为“ABC.Master”
  • 3个子页面为“第1页”,“第2页”,“第3页”。

第1页,第2页和第3页是母版页“ABC.Master”的子页面。

页面流程:

  1. 如果我点击登录后输入用户名和密码,它将移至页面 1
  2. 从第1页开始,如果点击某些链接,则会转到第2页
  3. 从第2页开始,如果单击“浏览器返回”按钮,会话将过期
  4. 注意:它应该纯粹像银行网站。即)单击浏览器返回 按钮会话必须过期。

1 个答案:

答案 0 :(得分:4)

这已成为一段时间的问题。大多数人都用它来解决它:

protected void Page_Load(object sender, EventArgs e)
{
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Response.Cache.SetExpires(Now.AddSeconds(-1));
    Response.Cache.SetNoStore();
}

此代码段基本上指示所关注的页面在发布后立即过期,并将页面设置为不缓存其内容。

但是,某些浏览器可能会忽略页面缓存设置,而某些用户可能仍会多次提交表单。

解决方法:

protected void Page_Load(object sender, EventArgs e)
{
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Response.Cache.SetExpires(Now.AddSeconds(-1));
    Response.Cache.SetNoStore();

    if (Page.IsPostBack){
        if (isPageExpired()){
           Response.Redirect("expired.htm");
        }
        else {
           Session("TimeStamp") = Now.ToString;
           ViewState("TimeStamp") = Now.ToString;
        }
    }
}


private boolean isPageExpired()
{
    if (Session("TimeStamp") == null || ViewState("TimeStamp") == null)
        return false;
    else if (Session("TimeStamp") == ViewState("TimeStamp"))
        return true;
    else
        return false;
}

基本上,无论何时加载页面,它都会通过调用isPageExpired函数来检查它是否是重新提交的页面。如果函数返回true,则将页面重定向到页面过期响应;如果没有,它设置两个时间戳:一个保存在会话状态,另一个视图状态。

isPageExpired函数比较会话状态中保存的时间戳和viewstate中的时间戳。如果它们不同,则用户已从缓存中提交表单;然后,页面将它们引导到Page-expired响应。