25

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

6 回答 6

65

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

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

希望这可以帮助。

于 2013-10-11T10:23:49.247 回答
11

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

因此,通过使 CustomAttribute like[NoCache]和 decorate为所有页面添加这个

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="">
于 2013-10-11T10:23:59.967 回答
6

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

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

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

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

祝你今天过得愉快!

于 2018-02-20T14:20:44.963 回答
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
于 2017-03-02T06:07:54.077 回答
0

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

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

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

希望这会对你有所帮助,快乐编码!

于 2019-03-09T06:18:13.737 回答
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);
    }
于 2017-07-27T18:28:02.400 回答