如何在mvc3.net中注销后禁用浏览器后退按钮

S.p*_*S.p 9 javascript asp.net-mvc-3 form-authentication

我正在使用FormsAuthentication用户登录.用户成功注销后我遇到问题后退按钮是浏览器允许用户查看页面.我尝试使用javascript

 <script type = "text/javascript" >
        function preventBack() { window.history.forward(1); }
        setTimeout("preventBack()", 0);
        window.onunload = function () { null };
</script>
Run Code Online (Sandbox Code Playgroud)

但后退按钮完全禁用.它工作了,我不想在用户登录时禁用后退按钮功能.我希望我的LOGGED IN用户正常使用浏览器后退按钮.但是一旦他选择退出,他就不允许通过按Back来查看任何内容.我也试过用

Session.Abandon();
 Response.Cache.SetCacheability(HttpCacheability.NoCache);
 Response.Cache.SetExpires(DateTime.Now);
Run Code Online (Sandbox Code Playgroud)

但这也没有用.我该解决这个问题吗?

Ric*_*lly 17

您可以在用户注销时清除浏览器历史记录:

var url = window.location.href;
window.history.go(-window.history.length);
window.location.href = url;
Run Code Online (Sandbox Code Playgroud)

然而,这不会特别强大 - 它依赖于javascript,它不适用于多个选项卡,并且可能仅用于惹恼用户.IMO最好的办法是设置适当的缓存标题,以便浏览器不会通过适当应用的NoCacheAttribute缓存任何"登录"页面:

public class NoCacheAttribute : ActionFilterAttribute
{  
  public override void OnResultExecuting(ResultExecutingContext filterContext)
  {
      filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
      filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false);
      filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
      filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
      filterContext.HttpContext.Response.Cache.SetNoStore();

      base.OnResultExecuting(filterContext);
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 我尝试使用Nocacheattribute并且它work.thnkx (2认同)

Arj*_*ith 7

在html页面中使用此代码,您需要在其中控制后退按钮.

$().ready(function() {
    if(document.referrer != 'http://localhost:8181/'){ 
        history.pushState(null, null, 'login');
        window.addEventListener('popstate', function () {
            history.pushState(null, null, 'login');
        });
    }
});
Run Code Online (Sandbox Code Playgroud)

此代码将阻止后退按钮事件.如果前一页是' http:// localhost:8181 / ' ,if条件是允许后退按钮.如果上一页不是' http:// localhost:8181 / ',则后退按钮将不起作用.如果您需要阻止所有以前的页面,则避免使用if条件.该history.pushState声明将取代浏览器的地址栏"登录"的网址.因此,我建议您使用页面网址更改"登录".

这种方法的优点: -

  1. 无需控制缓存.
  2. 我们可以允许指定前一页的后退按钮事件,并可以阻止其余页面.

希望我的回答能帮助别人.


sur*_*ran 5

禁用后退按钮不是满足您需求的正确方法.相反,您可以在html文件中添加以下三个标记,它们负责清除缓存.

<META Http-Equiv="Cache-Control" Content="no-cache">
<META Http-Equiv="Pragma" Content="no-cache">
<META Http-Equiv="Expires" Content="0">
Run Code Online (Sandbox Code Playgroud)