Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.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
Asp.net mvc 注销后,如果按“浏览器后退”按钮,则返回上一屏幕_Asp.net Mvc_Asp.net Mvc 4_Razor - Fatal编程技术网

Asp.net mvc 注销后,如果按“浏览器后退”按钮,则返回上一屏幕

Asp.net mvc 注销后,如果按“浏览器后退”按钮,则返回上一屏幕,asp.net-mvc,asp.net-mvc-4,razor,Asp.net Mvc,Asp.net Mvc 4,Razor,您好,我第一次在MVC中开发解决方案,所以我面临一个大问题, 当我从我的应用程序(mvc razor web应用程序)中注销时,它会显示登录页面,但如果我按下浏览器后退按钮,它会显示最后一个屏幕,我不想要这个,我希望如果我按下后退按钮,它仍会显示相同的登录页面。 这是我的注销代码 public ActionResult Logout() { Session.Clear(); Session.Abandon(); Session.Remove

您好,我第一次在MVC中开发解决方案,所以我面临一个大问题, 当我从我的应用程序(mvc razor web应用程序)中注销时,它会显示登录页面,但如果我按下浏览器后退按钮,它会显示最后一个屏幕,我不想要这个,我希望如果我按下后退按钮,它仍会显示相同的登录页面。 这是我的注销代码

public ActionResult Logout()
    {
        Session.Clear();
        Session.Abandon();
        Session.RemoveAll();

        FormsAuthentication.SignOut();


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

        return RedirectToAction("Login");
    }

不久前我遇到了这个问题,禁用整个应用程序的缓存解决了我的问题,只需将这些行添加到
Global.asax.cs
文件中

        protected void Application_BeginRequest()
        {
            Response.Cache.SetCacheability(HttpCacheability.NoCache);
            Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1));
            Response.Cache.SetNoStore();
        }

希望这有帮助。

您需要为您访问的所有最后一页添加缓存
META
标记

因此,通过创建一个像
[NoCache]
这样的自定义属性,为所有页面添加这个属性,并进行装饰

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.SetCacheability(HttpCacheability.NoCache);
        filterContext.HttpContext.Response.Cache.SetNoStore();

        base.OnResultExecuting(filterContext);
    }
}


public class AccountController : Controller
{
    [NoCache]
    public ActionResult Logout()
    {
        return View();
    }
}
或者在页面上使用javascript进行尝试,如

<SCRIPT type="text/javascript">
    window.history.forward();
    function noBack() { window.history.forward(); }
</SCRIPT>

<BODY onload="noBack();"
    onpageshow="if (event.persisted) noBack();" onunload="">

window.history.forward();
函数noBack(){window.history.forward();}
受保护的无效应用程序\u BeginRequest()
{
Response.Cache.SetCacheability(HttpCacheability.NoCache);
SetExpires(DateTime.UtcNow.AddHours(-1));
Response.Cache.SetNoStore();
字符串emailAddress=null;
var cookie=Request.Cookies[FormsAuthentication.FormScookeName];
//如果没有饼干就没什么可做的
if(cookie!=null)
{
//解密cookie
var data=FormsAuthentication.Decrypt(cookie.Value);
//如果为空,则无需执行任何操作
如果(数据!=null)
{
//反序列化存储在cookie中的自定义数据
var o=JsonConvert.DeserializeObject(data.UserData);
//如果为空,则无需执行任何操作
如果(o!=null)
emailAddress=o.emailAddress;
}
}
SetupAutoFac(电子邮件地址);
}

MVC 5应用程序最简单的方法是:

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "None")]
以上是您不希望缓存的每个控制器方法。或者,如果您正在使用.Core,请执行以下操作:

[ResponseCache(Location = ResponseCacheLocation.None, NoStore = true)]

祝你今天愉快

您可以使用javascript的onClick事件来阻止浏览器返回。 例如:

<a onclick="noBack()" href="#">Logout</a>

<Script type="text/javascript">
     window.history.forward();
     function noBack() { window.history.forward(); }
</Script>

window.history.forward();
函数noBack(){window.history.forward();}

希望这将帮助你,快乐编码

这是否意味着您不能在整个应用程序中缓存任何内容?不,但当您回击时,您的控件会点击您的操作,而不是直接加载以前访问过的页面。禁用整个应用程序的页面缓存是一个糟糕的解决方案,这意味着您的服务器会再次执行该操作。这里的解决方案应该是独立的,而不是整个应用程序。禁用“后退”按钮只是一种解决方法,我希望您知道,使用
NoCache
装饰所有操作或控制器与我的几乎相同!阿西班的解决方案是最好的。谢谢你,先生。没有理由要求清除和放弃。选择一个或另一个,否则将来可能会出现一些行为问题,例如意外触发特定于会话的事件。您说,当您按下浏览器上的“后退”按钮并显示最后一个屏幕时,最后一个屏幕是什么?从何处调用注销?最后一个屏幕肯定是一个注销页面,因此没有什么可看的?使用System.Web.Mvc.OutputCache属性装饰控制器或其操作。但这会禁用所有操作方法的缓存吗?@Murali Murugesan the[nocache]当我在注销上面使用它时不会被解雇,但当我在控制器类上面使用它时会被解雇
[ResponseCache(Location = ResponseCacheLocation.None, NoStore = true)]
<a onclick="noBack()" href="#">Logout</a>

<Script type="text/javascript">
     window.history.forward();
     function noBack() { window.history.forward(); }
</Script>