如何在ASP.NET中通过单击浏览器返回按钮来使会话过期

4
这是我的场景:
我有以下页面:
1个登录页面 1个名称为“ABC.Master”的母版页 3个子页面,分别为“page 1”,“page 2”和“page 3”。
页面 1、页面 2 和页面 3 是母版页“ABC.Master”的子页面。
页面流程:
1. 输入用户名和密码后,如果单击登录,则会移动到页面1。 2. 从页面1,如果单击某些链接,则会移动到页面2。 3. 从页面2,如果单击浏览器的返回按钮,则会话应该过期。
注意:它应该纯粹像银行网站。即)单击浏览器的后退按钮后,会话必须过期。

我的银行在后退时不会过期会话;它们只是可能失去任何应用的过滤器(但这只是因为页面通过POST请求查看而导致的警告)。 - Brad Christie
好的,关于银行网站的事情就不谈了。现在,如果我点击浏览器的返回按钮,会话应该过期。 - user3253097
那么您可能正在考虑存储最近N次访问站点的参数,并检查当前请求是否与先前的匹配。 - Brad Christie
我已经尝试过了,但它没有起作用。我可以在Team Viewer中分享我的屏幕吗? - user3253097
1个回答

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函数比较在会话状态中保存的时间戳和视图状态中的时间戳。如果它们不同,用户就从缓存中提交了表单;然后,页面将其重定向到“页面已过期”响应。


在我的页面中不应使用时间戳,而应根据浏览器事件进行处理。 - user3253097

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接