注销浏览器后退按钮然后返回最后一个屏幕

时间:2013-10-11 10:19:47

标签: asp.net-mvc asp.net-mvc-4 razor

您好我是第一次在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");
    }

6 个答案:

答案 0 :(得分:57)

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

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

希望这有帮助。

答案 1 :(得分:10)

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

因此,通过制作像[NoCache]这样的CustomAttribute并装饰

,为所有页面添加此内容
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="">

答案 2 :(得分:2)

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

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "None")]

在每个控制器方法之上,您不想要缓存。或者,如果您正在使用.Core以下工作:

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

度过美好的一天!

答案 3 :(得分:0)

protected void Application_BeginRequest()
        {
            Response.Buffer = true;
            Response.ExpiresAbsolute = DateTime.Now.AddDays(-1d);
            Response.Expires = -1500;
            Response.CacheControl = "no-cache";
            Response.Cache.SetNoStore();
        }

Add [Authorize] filter on each controller

答案 4 :(得分:0)

  protected void Application_BeginRequest()
    {
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1));
        Response.Cache.SetNoStore();
        string emailAddress = null;
        var cookie =Request.Cookies[FormsAuthentication.FormsCookieName];
        // Nothing to do if no cookie
        if (cookie != null)
        {
            // Decrypt the cookie
            var data = FormsAuthentication.Decrypt(cookie.Value);
            // Nothing to do if null
            if (data != null)
            {
                // Deserialize the custom data we stored in the cookie
                var o = JsonConvert.DeserializeObject<FormsAuthenticationTicketData>(data.UserData);

                // Nothing to do if null
                if (o != null)
                    emailAddress = o.EmailAddress;
            }
        }
        SetupAutoFac(emailAddress);
    }

答案 5 :(得分:0)

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

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

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

希望这对您有帮助,快乐编码!