Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何仅在mvc3.net中注销后禁用浏览器后退按钮_Javascript_Asp.net Mvc 3_Form Authentication - Fatal编程技术网

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

Javascript 如何仅在mvc3.net中注销后禁用浏览器后退按钮,javascript,asp.net-mvc-3,form-authentication,Javascript,Asp.net Mvc 3,Form Authentication,我正在使用FormsAuthentication进行用户登录。 用户成功注销后,我遇到了一个问题。后退按钮是浏览器允许用户查看页面。 我试着使用javascript <script type = "text/javascript" > function preventBack() { window.history.forward(1); } setTimeout("preventBack()", 0); window.onunload

我正在使用FormsAuthentication进行用户登录。 用户成功注销后,我遇到了一个问题。后退按钮是浏览器允许用户查看页面。 我试着使用javascript

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

但这也不起作用。如何解决此问题?

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

var url = window.location.href;
window.history.go(-window.history.length);
window.location.href = url;
然而,这并不是特别健壮——它依赖于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);
  }
}

禁用“后退”按钮不是满足您需要的正确方法。相反,您可以在html文件中添加以下三个标记,用于清除缓存

<META Http-Equiv="Cache-Control" Content="no-cache">
<META Http-Equiv="Pragma" Content="no-cache">
<META Http-Equiv="Expires" Content="0">

请在母版页加载事件中使用此代码

if(!IsPostBack)
        {
            if (Session["LoginId"] == null)
                Response.Redirect("frmLogin.aspx");
            else
            {
                Response.ClearHeaders();
                Response.AddHeader("Cache-Control", "no-cache, no-store, max-age=0, must-revalidate");
                Response.AddHeader("Pragma", "no-cache");
                            }
        }

希望有帮助!:)

我发现最简单的方法是使用


请通读这篇文章。我在我的布局页面中使用了作者提供的JavaScript函数来防止后退按钮问题,因为我需要向我网站的所有访问者提供对某些页面的访问

这个解决方案在IE 11和Chrome版本43.0.2357.130 m中对我有效

希望这有帮助。


 <script language="JavaScript" type="text/javascript">
    window.history.forward();              
 </script> 
window.history.forward();
在需要控制后退按钮的html页面中使用此代码

$().ready(function() {
    if(document.referrer != 'http://localhost:8181/'){ 
        history.pushState(null, null, 'login');
        window.addEventListener('popstate', function () {
            history.pushState(null, null, 'login');
        });
    }
});
此代码将阻止后退按钮事件。if条件用于在上一页为“”时允许“后退”按钮。如果上一页不是“”,则“后退”按钮将不起作用。如果需要阻止前面的所有页面,请避免使用If条件。history.pushState语句将把浏览器地址栏上的url替换为“login”。因此,我建议您使用页面url更改“登录”

这种方法的优点:-

  • 不需要控制缓存
  • 我们可以为指定的前几页允许back按钮事件,并可以阻止其余页面

  • 希望我的回答能对其他人有所帮助。

    如果您希望所有页面都使用此选项,您可以在Global.asax中书写:

    var url = window.history.forward();
    window.history.go(-window.history.length);
    
    protected void Application_BeginRequest()
    {
    Response.AddHeader("Cache-Control", "no-cache, no-store, must-revalidate");
    Response.AddHeader("Pragma", "no-cache");
    Response.AddHeader("Expires", "0");
    }
    

    这不会缓存您站点的任何页面。

    我怀疑这是个坏主意,因为用户可以禁用javascript,然后按“上一步”按钮。我们如何使用它?你能举个例子吗?我如何在注销方法中调用它?def/logout.htmlend@codeObserver查看ActionFilters的介绍。注意:这种方法不适用于绕过ASP.NETMVC处理管道的请求(例如静态文件)@RichO'Kelly我在我的注销操作方法中使用这个,但它不起作用,我的方法只是清除会话并重定向到主页page@RichO凯利:我已经让它工作了,动作过滤器正在被执行,但在按下“后退”按钮后,我仍然可以访问上一页,所以我认为缓存不会被执行cleared@mohit道歉延迟-错过您的评论。该属性需要应用于所有只有在登录时才可访问的页面-在执行注销操作时应用该属性不会产生任何效果。我们必须将该属性放在哪个html中?放在您不希望缓存的html文件中。但是,如果您正在寻找一种根本不缓存任何文件的方法,那么您应该将服务器配置更新为不缓存[在http头中]。是否可以这样做,当我们到达特定页面时,所有缓存都应该被删除。当我们到达登录页面时,所有缓存都应该被删除。服务器可以将其发送到客户端的资源的缓存时间从无缓存控制为5分钟、1天、1周或根据您的需要。但无法从服务器端强制浏览器清除其缓存。是否必须在所有控制器上使用此选项?是的。但是如果你想把它设置为全局的,那么看看上面选择的答案。真的很有用。谢谢你的帮助谢谢,我必须把它包括在我的登录页面中!你也许应该对你的答案加上一些解释。顺致敬意,
    var url = window.history.forward();
    window.history.go(-window.history.length);
    
    protected void Application_BeginRequest()
    {
    Response.AddHeader("Cache-Control", "no-cache, no-store, must-revalidate");
    Response.AddHeader("Pragma", "no-cache");
    Response.AddHeader("Expires", "0");
    }