29

我正在寻找一种解决方案,让用户在注销后使用浏览器的后退按钮导航到上一页。

我在 asp.net 中构建了一个 Web 应用程序,并使用自定义成员资格提供程序进行身份验证和授权。一切正常,除非用户单击注销链接以注销应用程序并重定向到默认封面,如果使用单击浏览器上的 BACK BUTTON,它实际上会回到他们之前的位置并且数据仍会显示。

当然他们不能在那个页面上做任何事情,点击任何链接他们将再次重定向到登录页面。但是这些信息显示让很多用户感到困惑。

我只是想知道是否有任何方法可以清除浏览器的历史记录,因此使用无法返回,或者当他们单击后退按钮并让他们重定向到登录页面时。

谢谢

4

7 回答 7

23

担心浏览器历史和后退按钮会让你头疼和尖锐湿疣。有内置的设施来处理这个问题。

您的注销链接/按钮应指向包含此代码的页面,以及您想要的任何其他内容。

[vb.net]

Imports System.Web.Security

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
 Handles MyBase.Load
    Session.Abandon()
    FormsAuthentication.SignOut()
End Sub

[C#]

using System.Web.Security;

private void Page_Load(object sender, System.EventArgs e)
{
    // Put user code to initialize the page here
    Session.Abandon();
    FormsAuthentication.SignOut();
}

代码来自这个页面并且是有效的,但是页面很难看。

关于后退按钮行为的一个很好的问题/答案可以在这里找到。

更新:

根据我与 Matthew 的对话,可以使用如下代码来禁用敏感或易变的单个页面上的缓存:

Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();

我很想知道它是否对你有用,对我也有用。

于 2010-04-21T22:25:52.383 回答
3

您可以使用 javascript 禁用后退按钮(通常通过将用户发送到转发到另一个页面的页面,以便单击后退让您再次转发)。持久用户仍然可以在历史记录中回退 2 步并跳过循环。

该页面位于浏览器的缓存中。您可以要求浏览器不缓存任何内容,但这会破坏性能,有时甚至会非常严重,所以我不推荐它。

于 2010-04-21T22:27:49.693 回答
1

你的答案

解决方法是将以下 javascript 代码添加到 logout.aspx 页面的部分:

<script type="text/javascript">
 window.history.forward(1);
</script>

如果用户通过按后退按钮进入注销页面,此 javascript 代码将转发用户。

如果您需要确保用户在注销后无法返回页面,则必须通过在每个页面上包含类似于以下的代码来要求浏览器不要缓存任何页面:

Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1)); 
Response.Cache.SetCacheability(HttpCacheability.NoCache); 
Response.Cache.SetNoStore(); 
于 2013-12-10T07:14:11.417 回答
1

这段代码非常有用

Response.Cache.SetCacheability(HttpCacheability.NoCache);

仅将此代码放在加载事件上,以防万一,但它仅适用于 IE,适用于我使用的 IE 和 Firefox

Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();
于 2012-08-22T16:40:36.010 回答
0

如果有帮助,您可以尝试使用 HttpResponse.Cache 属性:

Response.Cache.SetExpires(DateTime.Now.AddSeconds(60));
Response.Cache.SetCacheability(HttpCacheability.Public);
Response.Cache.SetValidUntilExpires(false);
Response.Cache.VaryByParams["Category"] = true;

if (Response.Cache.VaryByParams["Category"])
{
//…
}

或者可以使用 HttpResponse.CacheControl 完全阻止页面的缓存,但它已被弃用,取而代之的是上面的 Cache 属性:

Response.CacheControl = “No-Cache”;

或者您真的可以发疯并手动完成所有操作:

Response.ClearHeaders();
Response.AppendHeader(“Cache-Control”, “no-cache”); //HTTP 1.1
Response.AppendHeader(“Cache-Control”, “private”); // HTTP 1.1
Response.AppendHeader(“Cache-Control”, “no-store”); // HTTP 1.1
Response.AppendHeader(“Cache-Control”, “must-revalidate”); // HTTP 1.1
Response.AppendHeader(“Cache-Control”, “max-stale=0″); // HTTP 1.1
Response.AppendHeader(“Cache-Control”, “post-check=0″); // HTTP 1.1
Response.AppendHeader(“Cache-Control”, “pre-check=0″); // HTTP 1.1
Response.AppendHeader(“Pragma”, “no-cache”); // HTTP 1.1
Response.AppendHeader(“Keep-Alive”, “timeout=3, max=993″); // HTTP 1.1
Response.AppendHeader(“Expires”, “Mon, 26 Jul 1997 05:00:00 GMT”); // HTTP 1.1

参考

于 2010-12-08T12:09:38.553 回答
0

最好的解决方法是将以下代码放在您的母版页中。它避免缓存页面并阻止用户在注销后访问它。

PS:以下代码是从各种来源编译的。将其发布在这里,因此任何寻找解决方案的人都可能会发现它很有用

大师.cs

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

    }

大师.aspx

<a href="logout.aspx">Logout</span></a>

注销.cs

protected void Timer1_Tick(object sender, EventArgs e)
        {
            Session.Clear();
            Session.Abandon();


 Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.Cache.SetNoStore();

        try
        {
            Session.Abandon();
            FormsAuthentication.SignOut();
            Response.Cache.SetCacheability(HttpCacheability.NoCache);
            Response.Buffer = true;
            Response.ExpiresAbsolute = DateTime.Now.AddDays(-1d);
            Response.Expires = -1000;
            Response.CacheControl = "no-cache";
            //Response.Redirect("login.aspx", true);
        }
        catch (Exception ex)
        {
            Response.Write(ex.Message);
        }
        Response.Redirect("Signin.aspx");
    }

注销.aspx

<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" Text="Loggin Out Please Wait" runat="server" />
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<div>
    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
            <asp:Timer ID="Timer1" runat="server" Interval="1000" OnTick="Timer1_Tick">
            </asp:Timer>
        </ContentTemplate>
    </asp:UpdatePanel>
</div>

</div>
</form>
于 2018-07-09T12:26:52.967 回答
-3

实际上我找到了一个解决方案,我将以下代码段添加到母版页的页面加载方法中。

Page.Response.Cache.SetCacheability(HttpCacheability.NoCache);

无论如何感谢您的回复:)

于 2010-04-21T22:30:06.913 回答